diff --git a/server/sql/tables.sql b/server/sql/tables.sql index 5788884..96e9328 100644 --- a/server/sql/tables.sql +++ b/server/sql/tables.sql @@ -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) diff --git a/server/src/eventHandler/ttnMessageReceivedEventHandler.ts b/server/src/eventHandler/ttnMessageReceivedEventHandler.ts index e682c01..e59893d 100644 --- a/server/src/eventHandler/ttnMessageReceivedEventHandler.ts +++ b/server/src/eventHandler/ttnMessageReceivedEventHandler.ts @@ -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,47 +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); - 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, - }; + const apiResponse = await getLocationForWifiMemoized(wifi.mac);; + // Only return valid data wifiScans (location for MAC was found) + 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, + } + } + return undefined; }) ); - await wifiScanService.createWifiScans(wifiScans); + const wifiScansFiltered = wifiScans.filter(w => (w !== undefined)); - const { totalWeight, weightedLatitude, weightedLongitude } = - wifiScans.reduce( - (acc, { latitude, longitude, rssi }) => { - if (latitude && longitude && rssi !== 0) { + // Store valid wifiScans into DB + const locatedWifiScans = await wifiScanService.createWifiScans(wifiScansFiltered); + + 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, } + ); - 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, diff --git a/server/src/proxy/wigle.ts b/server/src/proxy/wigle.ts index d2139cd..705c180 100644 --- a/server/src/proxy/wigle.ts +++ b/server/src/proxy/wigle.ts @@ -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); } };