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 {
@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);
}
\ No newline at end of file
......@@ -71,20 +71,20 @@ public class BLEFPBuilder {
private static void insertFPCellPerAP(List<FPElement> fp_cell_per_ap) {
MariaConnectionManager mngr = MariaConnectionManager.getInstance();
// transform list to map
// transform list to map to insert list of object
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()) {
FPBLEBuildDAO mapper = session.getMapper(FPBLEBuildDAO.class);
mapper.insertFpBleData(map);
mapper.listInsertFPBLEData(map);
session.commit();
}
}
private static void deleteFPCellPerAP(int cell_id) {
private static void deleteFPCell(int cell_id) {
MariaConnectionManager mngr = MariaConnectionManager.getInstance();
try (SqlSession session = mngr.getSqlSessionFactory().openSession()) {
......@@ -108,6 +108,62 @@ public class BLEFPBuilder {
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() {
// Todo read from Console or Database
......@@ -122,80 +178,76 @@ public class BLEFPBuilder {
System.out.println("scale_pixel : "+scale_pixel);
mFloor.setMap_scale_pixel(scale_pixel);
/*********************** Todo Loop of loop here ... *************************************/
// 수집방향 맵 준비
int[] temp = mFloor.loadRSSIDir();
System.out.println(Arrays.toString(temp));
/* Todo 8분위 되어 있는 기준값을 단말기에서 올려주는 값의 범위로 바꾸어 사용할 수 있도록 준비
switch case 사용
*/
int rssi_dir = temp[0];
System.out.println("RSSI_DIR : "+rssi_dir);
// location coordinate 준비
int M=3;
int N=5;
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();
int coordinate_pixel_x1 = ( mFloor.getBLECell(3,5).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_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();
System.out.printf("Pixel Coordinate : ("+coordinate_pixel_x1+", "+coordinate_pixel_y1+") ("+coordinate_pixel_x2+", "+coordinate_pixel_y2+")");
System.out.println();
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);
ble_list.forEach(System.out::println);
// sample ble_list
List<_ble_indicator> sample2 = Arrays.asList(
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
List<FPElement> fp_cell_per_ap = new ArrayList<>();
// map traverse using set view
Set<Map.Entry<String, List<Integer>>> entries = transform.entrySet();
for(Map.Entry<String,List<Integer>> entry : entries ) {
List<Integer> rssi_list = entry.getValue();
// calculate statistics
final int count = rssi_list.size();
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_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 rssi_std_dev = Math.sqrt(sum_of_dev/(count-1)); // Bessel correction for sample stdev
// 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);
fp_cell_per_ap.add(cell_elem);
}
for (FPElement print_elem : fp_cell_per_ap) {
System.out.println(print_elem);
int[] rssi_dir_index = mFloor.loadRSSIDir();
rssiDirBound rssi_dir;
for (int i =0; i < rssi_dir_index.length ; i++ ) { // 수집방향별로 세트를 구성
rssi_dir = normalizeRssiDir(rssi_dir_index[i]);
for (int m = 0; m < mFloor.getM(); m++) {
for (int n = 0; n < mFloor.getN(); n++) { // 격자별....
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, lower_rssi_dir : %d, upper_rssi_dir : %d ",
floor_id, building_id, campus_id, ble_cell_id, rssi_dir.get_lower_rssi_dir(), rssi_dir.get_upper_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();
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(m, n).get_location_y() - 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(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.println();
List<_ble_indicator> ble_list =
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);
// getting rssi_sub_list per ap_id by transform result-list to map<ap_id,rssi_sub_list> // AP 별 ....
Map<String, List<Integer>> transform = ble_list.stream().collect(Collectors.groupingBy(_ble_indicator::get_ap_id,
Collectors.mapping(_ble_indicator::get_rssi, Collectors.toList())));
// prepare for insert value for storing
List<FPElement> fp_cell_per_ap = null;
if ( transform.size() >0 ) {
fp_cell_per_ap = new ArrayList<>();
// map traverse using set view
Set<Map.Entry<String, List<Integer>>> entries = transform.entrySet();
for (Map.Entry<String, List<Integer>> entry : entries) {
List<Integer> rssi_list = entry.getValue();
// calculate statistics
final int count = rssi_list.size();
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_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 rssi_std_dev = Math.sqrt(sum_of_dev / (count - 1)); // Bessel correction for sample stdev
// populate insert value
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);
}
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);
//deleteFPCell(ble_cell_id);
}
else {
System.out.printf("there are no data...");
System.out.println();
}
}
}
}
// 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 ..*********************************************************************/
return true;
......
......@@ -13,23 +13,23 @@
SELECT
a.AP_ID, a.RSSI
FROM
( SELECT TAG_ID, COLLECTED_TIME, SEQUENCE_NUM
FROM raw_data_tag
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 RSSI_DIR &gt; #{lower_rssi_dir} and RSSI_DIR &lt; #{upper_rssi_dir}
) t
( SELECT TAG_ID, COLLECTED_TIME, SEQUENCE_NUM
FROM raw_data_tag
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 RSSI_DIR &gt; #{lower_rssi_dir} and RSSI_DIR &lt; #{upper_rssi_dir}
) t
INNER JOIN raw_data_ap AS a
ON t.tag_id = a.tag_id
AND t.collected_time = a.collected_time
AND t.sequence_num = a.sequence_num
ON t.tag_id = a.tag_id
AND t.collected_time = a.collected_time
AND t.sequence_num = a.sequence_num
</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)
VALUES <foreach collection="list" item="item" separator=",">
( #{item.floor_id}, #{item.building_id}, #{item.campus_id}, #{item.ble_cell_id}, #{item.rssi_dir}, #{item.ap_id},
#{item.rssi_avg},#{item.rssi_std_dev},#{item.rssi_collect_cnt},#{item.rssi_min},#{item.rssi_max})
VALUES <foreach collection="fp_cell_per_ap" item="fp_item" separator=",">
( #{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},
#{fp_item.rssi_avg},#{fp_item.rssi_std_dev},#{fp_item.rssi_collect_cnt},#{fp_item.rssi_min},#{fp_item.rssi_max})
</foreach>
</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