refactor wifi location parsing

This commit is contained in:
Hendrik Schutter 2025-01-02 16:31:55 +01:00
parent 3f3c47d629
commit ad32baa844
3 changed files with 41 additions and 37 deletions

View File

@ -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)

View File

@ -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,

View File

@ -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);
}
};