diff --git a/package-lock.json b/package-lock.json index 80cb09b..3bef957 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@liamcottle/meshcore.js", - "version": "1.10.0", + "version": "1.11.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@liamcottle/meshcore.js", - "version": "1.10.0", + "version": "1.11.0", "license": "MIT", "dependencies": { "@noble/curves": "^1.8.1", diff --git a/package.json b/package.json index a0ff302..a381602 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@liamcottle/meshcore.js", - "version": "1.10.0", + "version": "1.11.0", "description": "", "main": "src/index.js", "types": "index.d.ts", diff --git a/src/advert.js b/src/advert.js index 8e4bed9..5349436 100644 --- a/src/advert.js +++ b/src/advert.js @@ -9,8 +9,8 @@ class Advert { static ADV_TYPE_ROOM = 3; static ADV_LATLON_MASK = 0x10; - static ADV_BATTERY_MASK = 0x20; - static ADV_TEMPERATURE_MASK = 0x40; + static ADV_FEAT1_MASK = 0x20; + static ADV_FEAT2_MASK = 0x40; static ADV_NAME_MASK = 0x80; constructor(publicKey, timestamp, signature, appData) { @@ -81,6 +81,18 @@ class Advert { lon = bufferReader.readInt32LE(); } + // parse feat1 + var feat1 = null; + if(flags & Advert.ADV_FEAT1_MASK){ + feat1 = bufferReader.readUInt16LE(); + } + + // parse feat2 + var feat2 = null; + if(flags & Advert.ADV_FEAT2_MASK){ + feat2 = bufferReader.readUInt16LE(); + } + // parse name (remainder of app data) var name = null; if(flags & Advert.ADV_NAME_MASK){ @@ -92,6 +104,8 @@ class Advert { lat: lat, lon: lon, name: name, + feat1: feat1, + feat2: feat2, }; } diff --git a/src/packet.js b/src/packet.js index c3cfa2e..53a2f46 100644 --- a/src/packet.js +++ b/src/packet.js @@ -10,10 +10,10 @@ class Packet { static PH_VER_SHIFT = 6; static PH_VER_MASK = 0x03; // 2-bits - static ROUTE_TYPE_RESERVED1 = 0x00; // FUTURE + static ROUTE_TYPE_TRANSPORT_FLOOD = 0x00; // flood mode + transport codes static ROUTE_TYPE_FLOOD = 0x01; // flood mode, needs 'path' to be built up (max 64 bytes) static ROUTE_TYPE_DIRECT = 0x02; // direct route, 'path' is supplied - static ROUTE_TYPE_RESERVED2 = 0x03; // FUTURE + static ROUTE_TYPE_TRANSPORT_DIRECT = 0x03; // direct route + transport codes static PAYLOAD_TYPE_REQ = 0x00; // request (prefixed with dest/src hashes, MAC) (enc data: timestamp, blob) static PAYLOAD_TYPE_RESPONSE = 0x01; // response to REQ or ANON_REQ (prefixed with dest/src hashes, MAC) (enc data: timestamp, blob) @@ -27,12 +27,14 @@ class Packet { static PAYLOAD_TYPE_TRACE = 0x09; // trace a path, collecting SNR for each hop static PAYLOAD_TYPE_RAW_CUSTOM = 0x0F; // custom packet as raw bytes, for applications with custom encryption, payloads, etc - constructor(header, path, payload) { + constructor(header, path, payload, transportCode1, transportCode2) { this.header = header; this.path = path; this.payload = payload; + this.transportCode1 = transportCode1; + this.transportCode2 = transportCode2; // parsed info this.route_type = this.getRouteType(); @@ -45,12 +47,28 @@ class Packet { } static fromBytes(bytes) { + const bufferReader = new BufferReader(bytes); const header = bufferReader.readByte(); + + // check if packet has transport codes + const routeType = header & Packet.PH_ROUTE_MASK; + const hasTransportCodes = routeType === Packet.ROUTE_TYPE_TRANSPORT_FLOOD || routeType === Packet.ROUTE_TYPE_TRANSPORT_DIRECT; + + // parse transport codes + var transportCode1 = null; + var transportCode2 = null; + if(hasTransportCodes){ + transportCode1 = bufferReader.readUInt16LE(); + transportCode2 = bufferReader.readUInt16LE(); + } + const pathLen = bufferReader.readInt8(); const path = bufferReader.readBytes(pathLen); const payload = bufferReader.readRemainingBytes(); - return new Packet(header, path, payload); + + return new Packet(header, path, payload, transportCode1, transportCode2); + } getRouteType() { @@ -61,6 +79,8 @@ class Packet { switch(this.getRouteType()){ case Packet.ROUTE_TYPE_FLOOD: return "FLOOD"; case Packet.ROUTE_TYPE_DIRECT: return "DIRECT"; + case Packet.ROUTE_TYPE_TRANSPORT_FLOOD: return "TRANSPORT_FLOOD"; + case Packet.ROUTE_TYPE_TRANSPORT_DIRECT: return "TRANSPORT_DIRECT"; default: return null; } }