store location created from all location sources

This commit is contained in:
Hendrik Schutter 2025-01-01 21:39:34 +01:00
parent 2ed915601b
commit 50721114e3
3 changed files with 53 additions and 7 deletions

View File

@ -7,6 +7,6 @@ DB_PORT=""
WIGLE_TOKEN="" WIGLE_TOKEN=""
WIGLE_BASE_URL="https://api.wigle.net" WIGLE_BASE_URL="https://api.wigle.net"
WIGLE_NETWORK_SEARCH="/api/v2/network/search" WIGLE_NETWORK_SEARCH="/api/v2/network/search"
GET_LOCATION_WIFI_MAX_AGE=1209600000 # 14 Tage in Millisekunden (14 * 24 * 60 * 60 * 1000) GET_LOCATION_WIFI_MAX_AGE=1209600000 # 14 days in milliseconds (14 * 24 * 60 * 60 * 1000)
GET_LOCATION_WIFI_MAX=10000 GET_LOCATION_WIFI_MAX=10000
GET_LOCATION_WIFI_PRIMITIVE=true GET_LOCATION_WIFI_PRIMITIVE=true

View File

@ -13,11 +13,11 @@
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@types/express": "^5.0.0", "@types/express": "^5.0.0",
"@types/memoizee": "^0.4.11",
"@types/node": "^22.10.2", "@types/node": "^22.10.2",
"nodemon": "^3.1.9", "nodemon": "^3.1.9",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "^5.7.2", "typescript": "^5.7.2"
"@types/memoizee": "^0.4.11"
}, },
"dependencies": { "dependencies": {
"cors": "^2.8.5", "cors": "^2.8.5",

View File

@ -5,21 +5,25 @@ import {
} from "../event/ttnMessageReceivedEvent"; } from "../event/ttnMessageReceivedEvent";
import { container } from "tsyringe"; import { container } from "tsyringe";
import { LocationService } from "../services/locationService"; import { LocationService } from "../services/locationService";
import { WifiScanService } from "../services/wifiScanService";
import { getLocationForWifiMemoized } from "../proxy/wigle";
const locationService = container.resolve(LocationService); const locationService = container.resolve(LocationService);
const wifiScanService = container.resolve(WifiScanService);
domainEventEmitter.on( domainEventEmitter.on(
TtnMessageReceivedEventName, TtnMessageReceivedEventName,
async (event: TtnMessageReceivedEvent) => { async (event: TtnMessageReceivedEvent) => {
console.log(event); console.log(event);
var wifi_based_latitude: number; var wifi_based_latitude: number | undefined = undefined;
var wifi_based_longitude: number; var wifi_based_longitude: number | undefined = undefined;
var gnss_based_latitude: number | undefined = undefined; var gnss_based_latitude: number | undefined = undefined;
var gnss_based_longitude: number | undefined = undefined; var gnss_based_longitude: number | undefined = undefined;
var ttn_gw_based_latitude: number | undefined = undefined; var ttn_gw_based_latitude: number | undefined = undefined;
var ttn_gw_based_longitude: number | undefined = undefined; var ttn_gw_based_longitude: number | undefined = undefined;
// Get location based on TTN Gateways
if (!event.ttnGateways || event.ttnGateways.length === 0) { if (!event.ttnGateways || event.ttnGateways.length === 0) {
console.log("No TTN Gateway location received!") console.log("No TTN Gateway location received!")
} else { } else {
@ -45,11 +49,51 @@ domainEventEmitter.on(
ttn_gw_based_longitude = virtualLocation.longitude; ttn_gw_based_longitude = virtualLocation.longitude;
} }
// Get location based on WiFi Scans
if (!event.wifis || event.wifis.length === 0) {
console.log("No WiFi scans received!")
} else {
let totalWeight = 0;
let weightedLatitude = 0;
let weightedLongitude = 0;
{ // Process Wi-Fi data to compute weighted location
// TODO: parse Wifi location here await Promise.all(
event.wifis.map(async (wifi) => {
const apiResponse = await getLocationForWifiMemoized(wifi.mac);
if ((apiResponse != undefined) && (apiResponse?.totalResults > 0)) {
// Create new WiFi Scan entry if wigle.net reported location
const newWifiScan = wifiScanService.createWifiScan({
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,
})
// Calculate weight based on RSSI (higher signal strength gives more weight)
const weight = 1 / Math.abs((await newWifiScan).rssi);
totalWeight += weight;
// Accumulate weighted latitude and longitude
weightedLatitude += (await newWifiScan).latitude * weight;
weightedLongitude += (await newWifiScan).longitude * weight;
}
})
);
// Calculate the weighted average to get the virtual location
const virtualLocation = {
latitude: weightedLatitude / totalWeight,
longitude: weightedLongitude / totalWeight
};
console.log("Tracker location based on WiFi Scan location:", virtualLocation);
wifi_based_latitude = virtualLocation.latitude;
wifi_based_longitude = virtualLocation.longitude;
} }
// Get location based on GNSS
if ((event.gnssLocation.latitude) && (event.gnssLocation.longitude)) { if ((event.gnssLocation.latitude) && (event.gnssLocation.longitude)) {
gnss_based_latitude = event.gnssLocation.latitude; gnss_based_latitude = event.gnssLocation.latitude;
gnss_based_longitude = event.gnssLocation.longitude; gnss_based_longitude = event.gnssLocation.longitude;
@ -63,6 +107,8 @@ domainEventEmitter.on(
ttn_gw_longitude: ttn_gw_based_longitude, ttn_gw_longitude: ttn_gw_based_longitude,
gnss_latitude: gnss_based_latitude, gnss_latitude: gnss_based_latitude,
gnss_longitude: gnss_based_longitude, gnss_longitude: gnss_based_longitude,
wifi_latitude: wifi_based_latitude,
wifi_longitude: wifi_based_longitude,
}); });
console.log(newLocation) console.log(newLocation)