collect map reports

This commit is contained in:
liamcottle
2024-03-13 15:05:51 +13:00
parent 020b4be72c
commit 2761aa42de
3 changed files with 124 additions and 21 deletions

View File

@ -0,0 +1,25 @@
-- CreateTable
CREATE TABLE `map_reports` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`node_id` BIGINT NOT NULL,
`long_name` VARCHAR(191) NOT NULL,
`short_name` VARCHAR(191) NOT NULL,
`role` INTEGER NOT NULL,
`hardware_model` INTEGER NOT NULL,
`firmware_version` VARCHAR(191) NOT NULL,
`region` INTEGER NULL,
`modem_preset` INTEGER NULL,
`has_default_channel` BOOLEAN NULL,
`latitude` INTEGER NULL,
`longitude` INTEGER NULL,
`altitude` INTEGER NULL,
`position_precision` INTEGER NULL,
`num_online_local_nodes` INTEGER NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `map_reports_created_at_idx`(`created_at`),
INDEX `map_reports_updated_at_idx`(`updated_at`),
INDEX `map_reports_node_id_idx`(`node_id`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

View File

@ -39,6 +39,33 @@ model Node {
@@map("nodes") @@map("nodes")
} }
model MapReport {
id BigInt @id @default(autoincrement())
node_id BigInt
long_name String
short_name String
role Int
hardware_model Int
firmware_version String
region Int?
modem_preset Int?
has_default_channel Boolean?
latitude Int?
longitude Int?
altitude Int?
position_precision Int?
num_online_local_nodes Int?
created_at DateTime @default(now())
updated_at DateTime @default(now()) @updatedAt
@@index(created_at)
@@index(updated_at)
@@index(node_id)
@@map("map_reports")
}
model NeighbourInfo { model NeighbourInfo {
id BigInt @id @default(autoincrement()) id BigInt @id @default(autoincrement())
node_id BigInt node_id BigInt

View File

@ -19,6 +19,7 @@ root.resolvePath = (origin, target) => path.join(__dirname, "protos", target);
root.loadSync('meshtastic/mqtt.proto'); root.loadSync('meshtastic/mqtt.proto');
const Data = root.lookupType("Data"); const Data = root.lookupType("Data");
const ServiceEnvelope = root.lookupType("ServiceEnvelope"); const ServiceEnvelope = root.lookupType("ServiceEnvelope");
const MapReport = root.lookupType("MapReport");
const NeighborInfo = root.lookupType("NeighborInfo"); const NeighborInfo = root.lookupType("NeighborInfo");
const Position = root.lookupType("Position"); const Position = root.lookupType("Position");
const RouteDiscovery = root.lookupType("RouteDiscovery"); const RouteDiscovery = root.lookupType("RouteDiscovery");
@ -94,16 +95,20 @@ client.on("message", async (topic, message) => {
} }
} }
const logKnownPacketTypes = false;
const logUnknownPacketTypes = false;
const portnum = envelope.packet?.decoded?.portnum; const portnum = envelope.packet?.decoded?.portnum;
if(portnum === 3) { if(portnum === 3) {
const position = Position.decode(envelope.packet.decoded.payload); const position = Position.decode(envelope.packet.decoded.payload);
console.log("POSITION_APP", { if(logKnownPacketTypes){
from: envelope.packet.from.toString(16), console.log("POSITION_APP", {
position: position, from: envelope.packet.from.toString(16),
}); position: position,
});
}
// update node position in db // update node position in db
if(position.latitudeI != null && position.longitudeI){ if(position.latitudeI != null && position.longitudeI){
@ -129,10 +134,12 @@ client.on("message", async (topic, message) => {
const user = User.decode(envelope.packet.decoded.payload); const user = User.decode(envelope.packet.decoded.payload);
console.log("NODEINFO_APP", { if(logKnownPacketTypes) {
from: envelope.packet.from.toString(16), console.log("NODEINFO_APP", {
user: user, from: envelope.packet.from.toString(16),
}); user: user,
});
}
// create or update node in db // create or update node in db
try { try {
@ -166,10 +173,12 @@ client.on("message", async (topic, message) => {
const neighbourInfo = NeighborInfo.decode(envelope.packet.decoded.payload); const neighbourInfo = NeighborInfo.decode(envelope.packet.decoded.payload);
console.log("NEIGHBORINFO_APP", { if(logKnownPacketTypes) {
from: envelope.packet.from.toString(16), console.log("NEIGHBORINFO_APP", {
neighbour_info: neighbourInfo, from: envelope.packet.from.toString(16),
}); neighbour_info: neighbourInfo,
});
}
try { try {
await prisma.neighbourInfo.create({ await prisma.neighbourInfo.create({
@ -194,10 +203,12 @@ client.on("message", async (topic, message) => {
const telemetry = Telemetry.decode(envelope.packet.decoded.payload); const telemetry = Telemetry.decode(envelope.packet.decoded.payload);
console.log("TELEMETRY_APP", { if(logKnownPacketTypes) {
from: envelope.packet.from.toString(16), console.log("TELEMETRY_APP", {
telemetry: telemetry, from: envelope.packet.from.toString(16),
}); telemetry: telemetry,
});
}
// data to update // data to update
const data = {}; const data = {};
@ -230,10 +241,12 @@ client.on("message", async (topic, message) => {
const routeDiscovery = RouteDiscovery.decode(envelope.packet.decoded.payload); const routeDiscovery = RouteDiscovery.decode(envelope.packet.decoded.payload);
console.log("TRACEROUTE_APP", { if(logKnownPacketTypes) {
from: envelope.packet.from.toString(16), console.log("TRACEROUTE_APP", {
route_discovery: routeDiscovery, from: envelope.packet.from.toString(16),
}); route_discovery: routeDiscovery,
});
}
try { try {
await prisma.traceRoute.create({ await prisma.traceRoute.create({
@ -248,8 +261,46 @@ client.on("message", async (topic, message) => {
} }
else if(portnum === 73) {
const mapReport = MapReport.decode(envelope.packet.decoded.payload);
if(logKnownPacketTypes) {
console.log("MAP_REPORT_APP", {
from: envelope.packet.from.toString(16),
map_report: mapReport,
});
}
try {
await prisma.mapReport.create({
data: {
node_id: envelope.packet.from,
long_name: mapReport.longName,
short_name: mapReport.shortName,
role: mapReport.role,
hardware_model: mapReport.hwModel,
firmware_version: mapReport.firmwareVersion,
region: mapReport.region,
modem_preset: mapReport.modemPreset,
has_default_channel: mapReport.hasDefaultChannel,
latitude: mapReport.latitudeI,
longitude: mapReport.longitudeI,
altitude: mapReport.altitude,
position_precision: mapReport.positionPrecision,
num_online_local_nodes: mapReport.numOnlineLocalNodes,
},
});
} catch (e) {
console.error(e);
}
}
else { else {
// console.log(portnum, envelope); if(logUnknownPacketTypes){
console.log(portnum, envelope);
}
} }
} catch(e) { } catch(e) {