Commit bdc2aec4 authored by jaehyu's avatar jaehyu

implementing of building of fp_ble_data table (fingerprinting) is done.

parent d28bc3ca
...@@ -22,6 +22,6 @@ public interface FPBLEBuildDAO { ...@@ -22,6 +22,6 @@ public interface FPBLEBuildDAO {
@Param("ble_cell_coordi_x2")int ble_cell_coordi_x2, @Param("ble_cell_coordi_y2")int ble_cell_coordi_y2); @Param("ble_cell_coordi_x2")int ble_cell_coordi_x2, @Param("ble_cell_coordi_y2")int ble_cell_coordi_y2);
void insertFpBleData(Map<String, Object> map); void listInsertFPBLEData(Map<String, Object> map);
void deleteFpBleData(int cell_id); void deleteFpBleData(int cell_id);
} }
\ No newline at end of file
...@@ -71,20 +71,20 @@ public class BLEFPBuilder { ...@@ -71,20 +71,20 @@ public class BLEFPBuilder {
private static void insertFPCellPerAP(List<FPElement> fp_cell_per_ap) { private static void insertFPCellPerAP(List<FPElement> fp_cell_per_ap) {
MariaConnectionManager mngr = MariaConnectionManager.getInstance(); MariaConnectionManager mngr = MariaConnectionManager.getInstance();
// transform list to map // transform list to map to insert list of object
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("list", fp_cell_per_ap); map.put("fp_cell_per_ap", fp_cell_per_ap);
try (SqlSession session = mngr.getSqlSessionFactory().openSession()) { try (SqlSession session = mngr.getSqlSessionFactory().openSession()) {
FPBLEBuildDAO mapper = session.getMapper(FPBLEBuildDAO.class); FPBLEBuildDAO mapper = session.getMapper(FPBLEBuildDAO.class);
mapper.insertFpBleData(map); mapper.listInsertFPBLEData(map);
session.commit(); session.commit();
} }
} }
private static void deleteFPCellPerAP(int cell_id) { private static void deleteFPCell(int cell_id) {
MariaConnectionManager mngr = MariaConnectionManager.getInstance(); MariaConnectionManager mngr = MariaConnectionManager.getInstance();
try (SqlSession session = mngr.getSqlSessionFactory().openSession()) { try (SqlSession session = mngr.getSqlSessionFactory().openSession()) {
...@@ -108,6 +108,62 @@ public class BLEFPBuilder { ...@@ -108,6 +108,62 @@ public class BLEFPBuilder {
return ret; return ret;
} }
private class rssiDirBound {
private int lower_rssi_dir;
private int upper_rssi_dir;
private int _rssi_dir;
rssiDirBound(int rssi_dir, int lower, int upper) {
_rssi_dir = rssi_dir;
lower_rssi_dir = lower;
upper_rssi_dir = upper;
}
public int get_rssi_dir() {
return _rssi_dir;
}
public int get_lower_rssi_dir() {
return lower_rssi_dir;
}
public int get_upper_rssi_dir() {
return upper_rssi_dir;
}
}
private rssiDirBound normalizeRssiDir(int rssi_dir) {
rssiDirBound ret = null;
switch (rssi_dir) {
case 1000000: // North
ret = new rssiDirBound(rssi_dir, -23, 23);
break;
case 2000000: // North East
ret = new rssiDirBound(rssi_dir,22, 68);
break;
case 3000000: //East
ret = new rssiDirBound(rssi_dir,67, 113);
break;
case 4000000: //South East
ret = new rssiDirBound(rssi_dir,112, 158);
break;
case 5000000: //South
ret = new rssiDirBound(rssi_dir,157, -157);
break;
case 6000000: //South West
ret = new rssiDirBound(rssi_dir,-158, -112);
break;
case 7000000: // West
ret = new rssiDirBound(rssi_dir,-113, -67);
break;
case 8000000: // North West
ret = new rssiDirBound(rssi_dir,-68, -22);
break;
default:
break;
}
return ret;
}
public boolean build() { public boolean build() {
// Todo read from Console or Database // Todo read from Console or Database
...@@ -122,57 +178,45 @@ public class BLEFPBuilder { ...@@ -122,57 +178,45 @@ public class BLEFPBuilder {
System.out.println("scale_pixel : "+scale_pixel); System.out.println("scale_pixel : "+scale_pixel);
mFloor.setMap_scale_pixel(scale_pixel); mFloor.setMap_scale_pixel(scale_pixel);
/*********************** Todo Loop of loop here ... *************************************/ int[] rssi_dir_index = mFloor.loadRSSIDir();
// 수집방향 맵 준비 rssiDirBound rssi_dir;
int[] temp = mFloor.loadRSSIDir(); for (int i =0; i < rssi_dir_index.length ; i++ ) { // 수집방향별로 세트를 구성
System.out.println(Arrays.toString(temp)); rssi_dir = normalizeRssiDir(rssi_dir_index[i]);
/* Todo 8분위 되어 있는 기준값을 단말기에서 올려주는 값의 범위로 바꾸어 사용할 수 있도록 준비
switch case 사용 for (int m = 0; m < mFloor.getM(); m++) {
*/ for (int n = 0; n < mFloor.getN(); n++) { // 격자별....
int rssi_dir = temp[0];
System.out.println("RSSI_DIR : "+rssi_dir); ble_cell_id = mFloor.getBLECell(m, n).get_id();
// location coordinate 준비 System.out.printf("floor_id : %d, building_id : %d, campus_id : %d, ble_cell_id : %d, lower_rssi_dir : %d, upper_rssi_dir : %d ",
int M=3; floor_id, building_id, campus_id, ble_cell_id, rssi_dir.get_lower_rssi_dir(), rssi_dir.get_upper_rssi_dir() );
int N=5;
System.out.printf(" ble_cell_location : ("+mFloor.getBLECell(m,n).get_location_x()+", "+mFloor.getBLECell(m,n).get_location_y()+")");
ble_cell_id = mFloor.getBLECell(M,N).get_id();
System.out.printf("floor_id : %d, building_id : %d, campus_id : %d, ble_cell_id : %d, rssi_dir : %d,",
floor_id, building_id, campus_id, ble_cell_id, rssi_dir );
System.out.printf(" ble_cell_location : ("+mFloor.getBLECell(M,N).get_location_x()+", "+mFloor.getBLECell(M,N).get_location_y()+")");
System.out.println(); System.out.println();
int coordinate_pixel_x1 = ( mFloor.getBLECell(3,5).get_location_x() - CELL_SIZE_BLE/2 ) / (int)mFloor.getMap_scale_pixel(); int coordinate_pixel_x1 = (mFloor.getBLECell(m, n).get_location_x() - CELL_SIZE_BLE / 2) / (int) mFloor.getMap_scale_pixel();
int coordinate_pixel_y1 = ( mFloor.getBLECell(3,5).get_location_y() - CELL_SIZE_BLE/2 ) / (int)mFloor.getMap_scale_pixel(); int coordinate_pixel_y1 = (mFloor.getBLECell(m, n).get_location_y() - CELL_SIZE_BLE / 2) / (int) mFloor.getMap_scale_pixel();
int coordinate_pixel_x2 = ( mFloor.getBLECell(3,5).get_location_x() + CELL_SIZE_BLE/2 ) / (int)mFloor.getMap_scale_pixel(); int coordinate_pixel_x2 = (mFloor.getBLECell(m, n).get_location_x() + CELL_SIZE_BLE / 2) / (int) mFloor.getMap_scale_pixel();
int coordinate_pixel_y2 = ( mFloor.getBLECell(3,5).get_location_y() + CELL_SIZE_BLE/2 ) / (int)mFloor.getMap_scale_pixel(); int coordinate_pixel_y2 = (mFloor.getBLECell(m, n).get_location_y() + CELL_SIZE_BLE / 2) / (int) mFloor.getMap_scale_pixel();
System.out.printf("Pixel Coordinate : ("+coordinate_pixel_x1+", "+coordinate_pixel_y1+") ("+coordinate_pixel_x2+", "+coordinate_pixel_y2+")"); System.out.printf("Pixel Coordinate : ("+coordinate_pixel_x1+", "+coordinate_pixel_y1+") ("+coordinate_pixel_x2+", "+coordinate_pixel_y2+")");
System.out.println(); System.out.println();
List<_ble_indicator> ble_list = List<_ble_indicator> ble_list =
get_aplist_in_coordinate_per_rssidir(rssi_dir, rssi_dir, coordinate_pixel_x1, coordinate_pixel_y1, coordinate_pixel_x2, coordinate_pixel_y2); get_aplist_in_coordinate_per_rssidir(rssi_dir.get_lower_rssi_dir(), rssi_dir.get_upper_rssi_dir(), coordinate_pixel_x1, coordinate_pixel_y1, coordinate_pixel_x2, coordinate_pixel_y2);
ble_list.forEach(System.out::println);
// getting rssi_sub_list per ap_id by transform result-list to map<ap_id,rssi_sub_list> // AP 별 ....
// sample ble_list Map<String, List<Integer>> transform = ble_list.stream().collect(Collectors.groupingBy(_ble_indicator::get_ap_id,
List<_ble_indicator> sample2 = Arrays.asList( Collectors.mapping(_ble_indicator::get_rssi, Collectors.toList())));
new _ble_indicator("aaaaa", 1111),
new _ble_indicator("bbbb", 2222),
new _ble_indicator("aaaaa", 3333),
new _ble_indicator("ccccc", 4444),
new _ble_indicator("aaaaa", 5555),
new _ble_indicator("cccc", 6666),
new _ble_indicator("bbbb", 7777));
// getting rssi_sub_list per ap_id by transform result-list to map<ap_id,rssi_sub_list>
Map<String,List<Integer>> transform = sample2.stream().collect(Collectors.groupingBy(_ble_indicator::get_ap_id,
Collectors.mapping(_ble_indicator::get_rssi,Collectors.toList())));
// prepare for insert value for storing // prepare for insert value for storing
List<FPElement> fp_cell_per_ap = new ArrayList<>(); List<FPElement> fp_cell_per_ap = null;
if ( transform.size() >0 ) {
fp_cell_per_ap = new ArrayList<>();
// map traverse using set view // map traverse using set view
Set<Map.Entry<String, List<Integer>>> entries = transform.entrySet(); Set<Map.Entry<String, List<Integer>>> entries = transform.entrySet();
for(Map.Entry<String,List<Integer>> entry : entries ) { for (Map.Entry<String, List<Integer>> entry : entries) {
List<Integer> rssi_list = entry.getValue(); List<Integer> rssi_list = entry.getValue();
// calculate statistics // calculate statistics
...@@ -180,11 +224,11 @@ public class BLEFPBuilder { ...@@ -180,11 +224,11 @@ public class BLEFPBuilder {
final double rssi_min = rssi_list.stream().mapToDouble(Integer::doubleValue).summaryStatistics().getMin(); final double rssi_min = rssi_list.stream().mapToDouble(Integer::doubleValue).summaryStatistics().getMin();
final double rssi_max = rssi_list.stream().mapToDouble(Integer::doubleValue).summaryStatistics().getMax(); final double rssi_max = rssi_list.stream().mapToDouble(Integer::doubleValue).summaryStatistics().getMax();
final double rssi_avg = rssi_list.stream().mapToDouble(Integer::doubleValue).summaryStatistics().getAverage(); final double rssi_avg = rssi_list.stream().mapToDouble(Integer::doubleValue).summaryStatistics().getAverage();
final double sum_of_dev = rssi_list.stream().mapToDouble( x -> Math.pow(x.doubleValue() - rssi_avg ,2.0)).sum(); final double sum_of_dev = rssi_list.stream().mapToDouble(x -> Math.pow(x.doubleValue() - rssi_avg, 2.0)).sum();
final double rssi_std_dev = Math.sqrt(sum_of_dev/(count-1)); // Bessel correction for sample stdev final double rssi_std_dev = Math.sqrt(sum_of_dev / (count - 1)); // Bessel correction for sample stdev
// populate insert value // populate insert value
FPElement cell_elem = new FPElement(floor_id,building_id,campus_id,ble_cell_id,rssi_dir,entry.getKey(),count,rssi_min,rssi_max,rssi_avg,rssi_std_dev); FPElement cell_elem = new FPElement(floor_id, building_id, campus_id, ble_cell_id, rssi_dir.get_rssi_dir(), entry.getKey(), count, rssi_min, rssi_max, rssi_avg, rssi_std_dev);
fp_cell_per_ap.add(cell_elem); fp_cell_per_ap.add(cell_elem);
} }
...@@ -195,7 +239,15 @@ public class BLEFPBuilder { ...@@ -195,7 +239,15 @@ public class BLEFPBuilder {
// insert rows to db. (delete for to delete sample rows if there are sample raws in database) // insert rows to db. (delete for to delete sample rows if there are sample raws in database)
insertFPCellPerAP(fp_cell_per_ap); insertFPCellPerAP(fp_cell_per_ap);
// deleteFPCellPerAP(ble_cell_id); //deleteFPCell(ble_cell_id);
}
else {
System.out.printf("there are no data...");
System.out.println();
}
}
}
}
// Loop here ..*********************************************************************/ // Loop here ..*********************************************************************/
return true; return true;
......
...@@ -25,11 +25,11 @@ ...@@ -25,11 +25,11 @@
AND t.sequence_num = a.sequence_num AND t.sequence_num = a.sequence_num
</select> </select>
<insert id="insertFpBleData" parameterType="java.util.Map"> <insert id="listInsertFPBLEData" parameterType="java.util.Map">
INSERT INTO fp_ble_data (floor_id,building_id,campus_id,ble_cell_id,rssi_dir,ap_id,rssi_avg,rssi_std_dev,rssi_collect_cnt,rssi_min,rssi_max) INSERT INTO fp_ble_data (floor_id,building_id,campus_id,ble_cell_id,rssi_dir,ap_id,rssi_avg,rssi_std_dev,rssi_collect_cnt,rssi_min,rssi_max)
VALUES <foreach collection="list" item="item" separator=","> VALUES <foreach collection="fp_cell_per_ap" item="fp_item" separator=",">
( #{item.floor_id}, #{item.building_id}, #{item.campus_id}, #{item.ble_cell_id}, #{item.rssi_dir}, #{item.ap_id}, ( #{fp_item.floor_id}, #{fp_item.building_id}, #{fp_item.campus_id}, #{fp_item.ble_cell_id}, #{fp_item.rssi_dir}, #{fp_item.ap_id},
#{item.rssi_avg},#{item.rssi_std_dev},#{item.rssi_collect_cnt},#{item.rssi_min},#{item.rssi_max}) #{fp_item.rssi_avg},#{fp_item.rssi_std_dev},#{fp_item.rssi_collect_cnt},#{fp_item.rssi_min},#{fp_item.rssi_max})
</foreach> </foreach>
</insert> </insert>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment