refactor wifi location parsing
This commit is contained in:
		| @ -18,8 +18,8 @@ CREATE TABLE IF NOT EXISTS wifi_scan ( | ||||
|     lp_ttn_end_device_uplinks_id UUID, | ||||
|     mac VARCHAR(255), | ||||
|     rssi NUMERIC, | ||||
|     latitude DOUBLE, | ||||
|     longitude DOUBLE, | ||||
|     latitude DOUBLE NOT NULL, | ||||
|     longitude DOUBLE NOT NULL, | ||||
|     created_at_utc TIMESTAMP DEFAULT CURRENT_TIMESTAMP, | ||||
|     updated_at_utc TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||||
|     FOREIGN KEY (lp_ttn_end_device_uplinks_id) REFERENCES lp_ttn_end_device_uplinks(lp_ttn_end_device_uplinks_id) | ||||
|  | ||||
| @ -7,6 +7,7 @@ import { container } from "tsyringe"; | ||||
| import { LocationService } from "../services/locationService"; | ||||
| import { WifiScanService } from "../services/wifiScanService"; | ||||
| import { getLocationForWifiMemoized } from "../proxy/wigle"; | ||||
| import { WifiScan } from "../models/wifiScan"; | ||||
|  | ||||
| const locationService = container.resolve(LocationService); | ||||
| const wifiScanService = container.resolve(WifiScanService); | ||||
| @ -54,54 +55,52 @@ const CalculateWifiLocation = async (event: TtnMessageReceivedEvent) => { | ||||
|     console.log("No WiFi scans received!") | ||||
|   } else { | ||||
|     // Process Wi-Fi data to compute weighted location | ||||
|     const wifiScans = await Promise.all( | ||||
|     let wifiScans = await Promise.all( | ||||
|       event.wifis.map(async (wifi) => { | ||||
|         // Create new WiFi Scan entry if wigle.net reported location | ||||
|         const apiResponse = await getLocationForWifiMemoized(wifi.mac); | ||||
|         console.log(apiResponse); | ||||
|  | ||||
|         const apiResponse = await getLocationForWifiMemoized(wifi.mac);; | ||||
|         // Only return valid data wifiScans (location for MAC was found) | ||||
|         if ((apiResponse != undefined) && (apiResponse.success == true) && (apiResponse?.totalResults > 0)) { | ||||
|           console.log("Create new wifiScan: " + wifi.mac) | ||||
|         if ((apiResponse?.success == true) && (apiResponse.totalResults > 0)) { | ||||
|           return { | ||||
|             lp_ttn_end_device_uplinks_id: event.lp_ttn_end_device_uplinks_id, | ||||
|             mac: wifi.mac, | ||||
|             rssi: wifi.rssi, | ||||
|             latitude: apiResponse.results[0].trilat, | ||||
|             longitude: apiResponse.results[0].trilong, | ||||
|           }; | ||||
|             latitude: apiResponse?.results[0].trilat, | ||||
|             longitude: apiResponse?.results[0].trilong, | ||||
|           } | ||||
|         } | ||||
|         // Return null for invalid cases | ||||
|         console.log("Don't create new wifiScan: " + wifi.mac) | ||||
|         return null; | ||||
|         return undefined; | ||||
|       }) | ||||
|     ); | ||||
|  | ||||
|     const wifiScansFiltered = wifiScans.filter(w => (w !== undefined)); | ||||
|  | ||||
|     // Store valid wifiScans into DB | ||||
|     await wifiScanService.createWifiScans(wifiScans); | ||||
|     const locatedWifiScans = await wifiScanService.createWifiScans(wifiScansFiltered); | ||||
|  | ||||
|     const { totalWeight, weightedLatitude, weightedLongitude } = | ||||
|       wifiScans.reduce( | ||||
|         (acc, { latitude, longitude, rssi }) => { | ||||
|           console.log("Current WifiScan: " + latitude + " " + longitude + " " + rssi) | ||||
|           const weight = 1 / Math.abs(rssi); | ||||
|           acc.totalWeight += weight; | ||||
|           acc.weightedLatitude += latitude * weight; | ||||
|           acc.weightedLongitude += longitude * weight; | ||||
|           return acc; | ||||
|         }, | ||||
|         { | ||||
|           totalWeight: 0, | ||||
|           weightedLatitude: 0, | ||||
|           weightedLongitude: 0, | ||||
|         } | ||||
|       ); | ||||
|     if (locatedWifiScans.length !== 0) { | ||||
|       const { totalWeight, weightedLatitude, weightedLongitude } = | ||||
|         locatedWifiScans.reduce( | ||||
|           (acc, { latitude, longitude, rssi }) => { | ||||
|             const weight = 1 / Math.abs(rssi); | ||||
|             acc.totalWeight += weight; | ||||
|             acc.weightedLatitude += latitude * weight; | ||||
|             acc.weightedLongitude += longitude * weight; | ||||
|             return acc; | ||||
|           }, | ||||
|           { | ||||
|             totalWeight: 0, | ||||
|             weightedLatitude: 0, | ||||
|             weightedLongitude: 0, | ||||
|           } | ||||
|         ); | ||||
|  | ||||
|     // Calculate the weighted average to get the virtual location | ||||
|     virtualLocation.latitude = weightedLatitude / totalWeight; | ||||
|     virtualLocation.longitude = weightedLongitude / totalWeight; | ||||
|       // Calculate the weighted average to get the virtual location | ||||
|       virtualLocation.latitude = weightedLatitude / totalWeight; | ||||
|       virtualLocation.longitude = weightedLongitude / totalWeight; | ||||
|  | ||||
|     console.log("Tracker location based on WiFi Scan location:", virtualLocation); | ||||
|       console.log("Tracker location based on WiFi Scan location:", virtualLocation); | ||||
|     } | ||||
|   } | ||||
|   return { | ||||
|     wifi_latitude: virtualLocation.latitude, | ||||
|  | ||||
| @ -54,9 +54,14 @@ export const getLocationForWifi = async ( | ||||
|         Authorization: `Basic ${process.env.WIGLE_TOKEN}`, | ||||
|       }, | ||||
|     }); | ||||
|     return await response.json(); | ||||
|     if (response.ok) { | ||||
|       return await response.json(); | ||||
|     } | ||||
|     console.log(response.status); | ||||
|     return undefined; | ||||
|  | ||||
|   } catch (error) { | ||||
|     console.error("Fehler beim Aufruf des Services:", error); | ||||
|     console.error("Error during call of API wigle.net:", error); | ||||
|   } | ||||
| }; | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user