/** * Payload Decoder for Chirpstack and Milesight network server * * Copyright 2020 Milesight IoT * * @product VS121 */ function Decode(fPort, bytes) { var decoded = {}; decoded.devEUI = LoRaObject.devEUI; decoded.rssi = LoRaObject.rxInfo[0].rssi; for (i = 0; i < bytes.length; ) { var channel_id = bytes[i++]; var channel_type = bytes[i++]; // PROTOCOL VESION if (channel_id === 0xff && channel_type === 0x01) { decoded.protocol_version = bytes[i]; i += 1; } // SERIAL NUMBER else if (channel_id === 0xff && channel_type === 0x08) { decoded.sn = readString(bytes.slice(i, i + 6)); i += 6; } // HARDWARE VERSION else if (channel_id === 0xff && channel_type === 0x09) { decoded.hardware_version = readVersion(bytes.slice(i, i + 2)); i += 2; } // FIRMWARE VERSION else if (channel_id === 0xff && channel_type === 0x0a) { decoded.firmware_version = readVersion(bytes.slice(i, i + 4)); i += 4; } // PEOPLE COUNTER else if (channel_id === 0x04 && channel_type === 0xc9) { decoded.people_counter_all = bytes[i]; decoded.region_count = bytes[i + 1]; var region = readUInt16BE(bytes.slice(i + 2, i + 4)); for (var idx = 0; idx < decoded.region_count; idx++) { var tmp = "region_" + idx; decoded[tmp] = (region > idx) & 1; } i += 4; } else { break; } } return decoded; } // bytes to number function readUInt16BE(bytes) { var value = (bytes[0] << 8) + bytes[1]; return value & 0xffff; } // bytes to version function readVersion(bytes) { var temp = []; for (var idx = 0; idx < bytes.length; idx++) { temp.push((bytes[idx] & 0xff).toString(10)); } return temp.join("."); } // bytes to string function readString(bytes) { var temp = []; for (var idx = 0; idx < bytes.length; idx++) { temp.push(("0" + (bytes[idx] & 0xff).toString(16)).slice(-2)); } return temp.join(""); }