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,80 +178,76 @@ public class BLEFPBuilder { ...@@ -122,80 +178,76 @@ 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.println();
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 ); int coordinate_pixel_x1 = (mFloor.getBLECell(m, n).get_location_x() - CELL_SIZE_BLE / 2) / (int) mFloor.getMap_scale_pixel();
System.out.printf(" ble_cell_location : ("+mFloor.getBLECell(M,N).get_location_x()+", "+mFloor.getBLECell(M,N).get_location_y()+")"); int coordinate_pixel_y1 = (mFloor.getBLECell(m, n).get_location_y() - CELL_SIZE_BLE / 2) / (int) mFloor.getMap_scale_pixel();
System.out.println(); 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(m, n).get_location_y() + CELL_SIZE_BLE / 2) / (int) mFloor.getMap_scale_pixel();
int coordinate_pixel_x1 = ( mFloor.getBLECell(3,5).get_location_x() - 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+")");
int coordinate_pixel_y1 = ( mFloor.getBLECell(3,5).get_location_y() - CELL_SIZE_BLE/2 ) / (int)mFloor.getMap_scale_pixel(); System.out.println();
int coordinate_pixel_x2 = ( mFloor.getBLECell(3,5).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(); List<_ble_indicator> ble_list =
System.out.printf("Pixel Coordinate : ("+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);
System.out.println();
// getting rssi_sub_list per ap_id by transform result-list to map<ap_id,rssi_sub_list> // AP 별 ....
List<_ble_indicator> ble_list = Map<String, List<Integer>> transform = ble_list.stream().collect(Collectors.groupingBy(_ble_indicator::get_ap_id,
get_aplist_in_coordinate_per_rssidir(rssi_dir, rssi_dir, coordinate_pixel_x1, coordinate_pixel_y1, coordinate_pixel_x2, coordinate_pixel_y2); Collectors.mapping(_ble_indicator::get_rssi, Collectors.toList())));
ble_list.forEach(System.out::println);
// prepare for insert value for storing
// sample ble_list List<FPElement> fp_cell_per_ap = null;
List<_ble_indicator> sample2 = Arrays.asList( if ( transform.size() >0 ) {
new _ble_indicator("aaaaa", 1111), fp_cell_per_ap = new ArrayList<>();
new _ble_indicator("bbbb", 2222),
new _ble_indicator("aaaaa", 3333),
new _ble_indicator("ccccc", 4444), // map traverse using set view
new _ble_indicator("aaaaa", 5555), Set<Map.Entry<String, List<Integer>>> entries = transform.entrySet();
new _ble_indicator("cccc", 6666), for (Map.Entry<String, List<Integer>> entry : entries) {
new _ble_indicator("bbbb", 7777)); List<Integer> rssi_list = entry.getValue();
// getting rssi_sub_list per ap_id by transform result-list to map<ap_id,rssi_sub_list> // calculate statistics
Map<String,List<Integer>> transform = sample2.stream().collect(Collectors.groupingBy(_ble_indicator::get_ap_id, final int count = rssi_list.size();
Collectors.mapping(_ble_indicator::get_rssi,Collectors.toList()))); final double rssi_min = rssi_list.stream().mapToDouble(Integer::doubleValue).summaryStatistics().getMin();
final double rssi_max = rssi_list.stream().mapToDouble(Integer::doubleValue).summaryStatistics().getMax();
// prepare for insert value for storing final double rssi_avg = rssi_list.stream().mapToDouble(Integer::doubleValue).summaryStatistics().getAverage();
List<FPElement> fp_cell_per_ap = new ArrayList<>(); 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
// map traverse using set view
Set<Map.Entry<String, List<Integer>>> entries = transform.entrySet(); // populate insert value
for(Map.Entry<String,List<Integer>> entry : entries ) { 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);
List<Integer> rssi_list = entry.getValue(); fp_cell_per_ap.add(cell_elem);
}
// calculate statistics
final int count = rssi_list.size(); for (FPElement print_elem : fp_cell_per_ap) {
final double rssi_min = rssi_list.stream().mapToDouble(Integer::doubleValue).summaryStatistics().getMin(); System.out.println(print_elem);
final double rssi_max = rssi_list.stream().mapToDouble(Integer::doubleValue).summaryStatistics().getMax(); }
final double rssi_avg = rssi_list.stream().mapToDouble(Integer::doubleValue).summaryStatistics().getAverage(); // calculate mag_angle - 해당 cell의 각 수집방향에 대하여 수집된 지자기방향의 평균값으로 대표
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 // insert rows to db. (delete for to delete sample rows if there are sample raws in database)
insertFPCellPerAP(fp_cell_per_ap);
// populate insert value //deleteFPCell(ble_cell_id);
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); }
fp_cell_per_ap.add(cell_elem); else {
} System.out.printf("there are no data...");
System.out.println();
for (FPElement print_elem : fp_cell_per_ap) { }
System.out.println(print_elem); }
}
} }
// calculate mag_angle - 해당 cell의 각 수집방향에 대하여 수집된 지자기방향의 평균값으로 대표
// insert rows to db. (delete for to delete sample rows if there are sample raws in database)
insertFPCellPerAP(fp_cell_per_ap);
// deleteFPCellPerAP(ble_cell_id);
// Loop here ..*********************************************************************/ // Loop here ..*********************************************************************/
return true; return true;
......
...@@ -13,23 +13,23 @@ ...@@ -13,23 +13,23 @@
SELECT SELECT
a.AP_ID, a.RSSI a.AP_ID, a.RSSI
FROM FROM
( SELECT TAG_ID, COLLECTED_TIME, SEQUENCE_NUM ( SELECT TAG_ID, COLLECTED_TIME, SEQUENCE_NUM
FROM raw_data_tag FROM raw_data_tag
WHERE POSITION_X &gt; #{ble_cell_coordi_x1} and POSITION_X &lt; #{ble_cell_coordi_x2} WHERE POSITION_X &gt; #{ble_cell_coordi_x1} and POSITION_X &lt; #{ble_cell_coordi_x2}
AND POSITION_Y &gt; #{ble_cell_coordi_y1} and POSITION_Y &lt; #{ble_cell_coordi_y2} AND POSITION_Y &gt; #{ble_cell_coordi_y1} and POSITION_Y &lt; #{ble_cell_coordi_y2}
AND RSSI_DIR &gt; #{lower_rssi_dir} and RSSI_DIR &lt; #{upper_rssi_dir} AND RSSI_DIR &gt; #{lower_rssi_dir} and RSSI_DIR &lt; #{upper_rssi_dir}
) t ) t
INNER JOIN raw_data_ap AS a INNER JOIN raw_data_ap AS a
ON t.tag_id = a.tag_id ON t.tag_id = a.tag_id
AND t.collected_time = a.collected_time AND t.collected_time = a.collected_time
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