/** * Payload Decoder for Milesight Network Server * * Copyright 2023 Milesight IoT * * @product EM400-UDL */ function Decode(fPort, bytes) { return milesight(bytes); } function milesight(bytes) { var decoded = {}; for (var i = 0; i < bytes.length; ) { var channel_id = bytes[i++]; var channel_type = bytes[i++]; // BATTERY if (channel_id === 0x01 && channel_type === 0x75) { decoded.battery = bytes[i]; i += 1; } // TEMPERATURE else if (channel_id === 0x03 && channel_type === 0x67) { decoded.temperature = readInt16LE(bytes.slice(i, i + 2)) / 10; i += 2; } // DISTANCE else if (channel_id === 0x04 && channel_type === 0x82) { decoded.distance = readUInt16LE(bytes.slice(i, i + 2)); i += 2; } // POSITION else if (channel_id === 0x05 && channel_type === 0x00) { decoded.position = bytes[i] === 0 ? "normal" : "tilt"; i += 1; } // TEMPERATURE WITH ABNORMAL else if (channel_id === 0x83 && channel_type === 0x67) { decoded.temperature = readInt16LE(bytes.slice(i, i + 2)) / 10; decoded.temperature_abnormal = bytes[i + 2] == 0 ? false : true; i += 3; } // DISTANCE WITH ALARMING else if (channel_id === 0x84 && channel_type === 0x82) { decoded.distance = readUInt16LE(bytes.slice(i, i + 2)); decoded.distance_alarming = bytes[i + 2] == 0 ? false : true; i += 3; } else { break; } } return decoded; } /* ****************************************** * bytes to number ********************************************/ function readUInt16LE(bytes) { var value = (bytes[1] << 8) + bytes[0]; return value & 0xffff; } function readInt16LE(bytes) { var ref = readUInt16LE(bytes); return ref > 0x7fff ? ref - 0x10000 : ref; }