const { Mesh, Mqtt, Portnums, Telemetry, Config, Channel } = require("@meshtastic/protobufs"); const { fromBinary, toBinary, create } = require("@bufbuild/protobuf"); const { LoraStream } = require("./LoraStream"); const { MeshtasticStream } = require("./MeshtasticStream"); const net = require('net'); const client = new net.Socket(); const IP = '192.168.10.117'; const PORT = 4403; function sendHello() { const data = create(Mesh.ToRadioSchema, { payloadVariant: { case: "wantConfigId", value: 1, } }); sendToDevice(toBinary(Mesh.ToRadioSchema, data)); } function sendToDevice(data) { const bufferLength = data.length; const header = new Uint8Array([ 0x94, 0xC3, (bufferLength >> 8) & 0xFF, bufferLength & 0xFF, ]); data = new Uint8Array([...header, ...data]); client.write(data); } client.connect(PORT, IP, function() { console.log('Connected'); sendHello(); }); const meshtasticStream = new MeshtasticStream(); client.pipe(new LoraStream()).pipe(meshtasticStream); meshtasticStream.on('data', (data) => { parseMeshtastic(data['$typeName'], data); }) function parseMeshtastic(typeName, data) { switch(typeName) { case Mesh.MeshPacketSchema.typeName: onMeshPacket(data); break; case Mesh.NodeInfoSchema.typeName: console.log('node info'); break; } } function onMeshPacket(envelope) { const payloadVariant = envelope.payloadVariant.case; if (payloadVariant === 'encrypted') { // attempt decryption } const dataPacket = envelope.payloadVariant.value; const portNum = dataPacket.portnum; if (!portNum) { return; } let schema = null; switch (portNum) { case Portnums.PortNum.POSITION_APP: schema = Mesh.PositionSchema; break; case Portnums.PortNum.TELEMETRY_APP: schema = Telemetry.TelemetrySchema; break; case Portnums.PortNum.TEXT_MESSAGE_APP: // no schema? break; case Portnums.PortNum.WAYPOINT_APP: schema = Mesh.WaypointSchema; break; case Portnums.PortNum.TRACEROUTE_APP: schema = Mesh.RouteDiscoverySchema; break; case Portnums.PortNum.NODEINFO_APP: schema = Mesh.NodeInfoSchema; break; case Portnums.PortNum.NEIGHBORINFO_APP: schema = Mesh.NeighborInfoSchema; break; case Portnums.PortNum.MAP_REPORT_APP: schema = Mqtt.MapReportSchema; break; } if (schema !== null) { console.log(dataPacket); const decodedData = fromBinary(schema, dataPacket.payload); console.log(decodedData); } }