cleanup
This commit is contained in:
parent
f341e6039f
commit
6d20f4e54c
@ -11,6 +11,119 @@ import { getLocationForWifiMemoized } from "../proxy/wigle";
|
|||||||
const locationService = container.resolve(LocationService);
|
const locationService = container.resolve(LocationService);
|
||||||
const wifiScanService = container.resolve(WifiScanService);
|
const wifiScanService = container.resolve(WifiScanService);
|
||||||
|
|
||||||
|
const CalculateTtnGatewayLocation = async (event: TtnMessageReceivedEvent) => {
|
||||||
|
// Get location based on TTN Gateways
|
||||||
|
const virtualLocation = {
|
||||||
|
latitude: undefined as number | undefined,
|
||||||
|
longitude: undefined as number | undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!event.ttnGateways || event.ttnGateways.length === 0) {
|
||||||
|
console.log("No TTN Gateway location received!")
|
||||||
|
} else {
|
||||||
|
let totalWeight = 0;
|
||||||
|
let weightedLatitude = 0;
|
||||||
|
let weightedLongitude = 0;
|
||||||
|
|
||||||
|
event.ttnGateways.forEach(gw => {
|
||||||
|
const weight = 1 / Math.abs(gw.rssi); // Higher RSSI (closer to 0) gives more weight
|
||||||
|
totalWeight += weight;
|
||||||
|
weightedLatitude += gw.latitude * weight;
|
||||||
|
weightedLongitude += gw.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 TTN Gateway location:", virtualLocation);
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
ttn_latitude: virtualLocation.latitude,
|
||||||
|
ttn_longitude: virtualLocation.longitude,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const CalculateWifiLocation = async (event: TtnMessageReceivedEvent) => {
|
||||||
|
// Get location based on WiFi Scans
|
||||||
|
const virtualLocation = {
|
||||||
|
latitude: undefined as number | undefined,
|
||||||
|
longitude: undefined as number | undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!event.wifis || event.wifis.length === 0) {
|
||||||
|
console.log("No WiFi scans received!")
|
||||||
|
} else {
|
||||||
|
// Process Wi-Fi data to compute weighted location
|
||||||
|
const 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,
|
||||||
|
};
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
await wifiScanService.createWifiScans(wifiScans);
|
||||||
|
|
||||||
|
const { totalWeight, weightedLatitude, weightedLongitude } =
|
||||||
|
wifiScans.reduce(
|
||||||
|
(acc, { latitude, longitude, rssi }) => {
|
||||||
|
if (latitude && longitude && rssi !== 0) {
|
||||||
|
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;
|
||||||
|
|
||||||
|
console.log("Tracker location based on WiFi Scan location:", virtualLocation);
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
wifi_latitude: virtualLocation.latitude,
|
||||||
|
wifi_longitude: virtualLocation.longitude,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const CalculateGnssLocation = async (event: TtnMessageReceivedEvent) => {
|
||||||
|
// Default virtual location with undefined coordinates
|
||||||
|
const virtualLocation = {
|
||||||
|
latitude: undefined as number | undefined,
|
||||||
|
longitude: undefined as number | undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (virtualLocation.latitude === undefined || virtualLocation.longitude === undefined) {
|
||||||
|
console.log("No valid GNSS location received!");
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
gnss_latitude: virtualLocation.latitude,
|
||||||
|
gnss_longitude: virtualLocation.longitude,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
domainEventEmitter.on(
|
domainEventEmitter.on(
|
||||||
TtnMessageReceivedEventName,
|
TtnMessageReceivedEventName,
|
||||||
async (event: TtnMessageReceivedEvent) => {
|
async (event: TtnMessageReceivedEvent) => {
|
||||||
@ -23,83 +136,21 @@ domainEventEmitter.on(
|
|||||||
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) {
|
const virtualLocation = await CalculateTtnGatewayLocation(event);
|
||||||
console.log("No TTN Gateway location received!")
|
ttn_gw_based_latitude = virtualLocation.ttn_latitude;
|
||||||
} else {
|
ttn_gw_based_longitude = virtualLocation.ttn_longitude;
|
||||||
let totalWeight = 0;
|
|
||||||
let weightedLatitude = 0;
|
|
||||||
let weightedLongitude = 0;
|
|
||||||
|
|
||||||
event.ttnGateways.forEach(gw => {
|
|
||||||
const weight = 1 / Math.abs(gw.rssi); // Higher RSSI (closer to 0) gives more weight
|
|
||||||
totalWeight += weight;
|
|
||||||
weightedLatitude += gw.latitude * weight;
|
|
||||||
weightedLongitude += gw.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 TTN Gateway location:", virtualLocation);
|
|
||||||
ttn_gw_based_latitude = virtualLocation.latitude;
|
|
||||||
ttn_gw_based_longitude = virtualLocation.longitude;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get location based on WiFi Scans
|
if (event.wifis && event.wifis.length > 0) {
|
||||||
if (!event.wifis || event.wifis.length === 0) {
|
const virtualLocation = await CalculateWifiLocation(event);
|
||||||
console.log("No WiFi scans received!")
|
wifi_based_latitude = virtualLocation.wifi_latitude;
|
||||||
} else {
|
wifi_based_longitude = virtualLocation.wifi_longitude;
|
||||||
let totalWeight = 0;
|
|
||||||
let weightedLatitude = 0;
|
|
||||||
let weightedLongitude = 0;
|
|
||||||
|
|
||||||
// Process Wi-Fi data to compute weighted location
|
|
||||||
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
|
const virtualLocation = await CalculateGnssLocation(event);
|
||||||
if ((event.gnssLocation.latitude) && (event.gnssLocation.longitude)) {
|
gnss_based_latitude = virtualLocation.gnss_latitude;
|
||||||
gnss_based_latitude = event.gnssLocation.latitude;
|
gnss_based_longitude = virtualLocation.gnss_longitude;
|
||||||
gnss_based_longitude = event.gnssLocation.longitude;
|
|
||||||
} else {
|
|
||||||
console.log("No GNSS location received!")
|
|
||||||
}
|
|
||||||
|
|
||||||
const newLocation = await locationService.createLocation({
|
const newLocation = await locationService.createLocation({
|
||||||
lp_ttn_end_device_uplinks_id: event.lp_ttn_end_device_uplinks_id,
|
lp_ttn_end_device_uplinks_id: event.lp_ttn_end_device_uplinks_id,
|
||||||
|
Loading…
Reference in New Issue
Block a user