mqtt.js解析
示例報文:0000000102 {"topic":"/user/update_iot","method":"thing.event.property.post","params":{"temperature":258}}

function ProtocolSample(val) { var out = ''; if (1 == val) { out = '0000000102'; } else if (2 == val) { out = '{"method":"thing.service.property.set","params":{"temperature":258}}'; } return out; } var COMMAND_REPORT = 0x00; //屬性上報 var COMMAND_SET = 0x01; //屬性設置。 var PROP_REPORT_METHOD = 'thing.event.property.post'; //物聯網平台Topic,設備上傳屬性數據到雲端 var PROP_SET_METHOD = 'thing.service.property.set'; //物聯網平台Topic,雲端下發屬性控制指令到設備端 /* 示例數據: * 設備上報屬性數據 * 輸入: 0x000304027500000102 * 輸出:{"method":"thing.event.property.post","id":"50594421","params":{"temperature":258},"version":"1.0"} */ function rawDataToProtocol(hex) { var bytes = Str2Bytes(hex); var uint8Array = new Uint8Array(bytes.length); for (var i = 0; i < bytes.length; i++) { uint8Array[i] = bytes[i] & 0xff; } var dataView = new DataView(uint8Array.buffer, 0); //10進制bytes數組轉16進制字符串 var jsonMap = {}; var fHead = uint8Array[0]; // command if (fHead == COMMAND_REPORT) { var params = {}; params['temperature'] = dataView.getInt32(1); // 對應產品屬性中temperature // jsonMap['topic'] = '/user/update_iot'; jsonMap['method'] = PROP_REPORT_METHOD; jsonMap['params'] = params; //ALink JSON格式,params標准字段。 } return JSON.stringify(jsonMap); } /** * 將Alink協議的數據轉換為設備能識別的格式數據,物聯網平台給設備下發數據時調用 * 入參:jsonObj Alink JSON對象 不能為空 * 出參:rawData byte[]數組 不能為空 * * 輸入: {"method":"thing.service.property.set","params":{"temperature":258}} * 輸出: 0x010304027500000102 * */ function protocolToRawData(json) { var jsonObject = JSON.parse(json); var method = jsonObject['method']; var params = jsonObject['params']; var temperature = params['temperature']; var payloadArray = []; if (method == PROP_SET_METHOD) //屬性設置 { payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SET)); payloadArray = payloadArray.concat(buffer_int32(temperature)); } return Bytes2Str(payloadArray); } //十六進制字符串轉字節數組 function Str2Bytes(str) { var pos = 0; var len = str.length; if(len %2 != 0) { return null; } len /= 2; var hexA = new Array(); for(var i=0; i<len; i++) { var s = str.substr(pos, 2); var v = parseInt(s, 16); hexA.push(v); pos += 2; } return hexA; } //字節數組轉十六進制字符串 function Bytes2Str(arr) { var str = ""; for(var i=0; i<arr.length; i++) { var tmp = arr[i].toString(16); if(tmp.length == 1) { tmp = "0" + tmp; } str += tmp; } return str; } //以下是部分輔助函數。 function buffer_uint8(value) { var uint8Array = new Uint8Array(1); var dv = new DataView(uint8Array.buffer, 0); dv.setUint8(0, value); return [].slice.call(uint8Array); } function buffer_int16(value) { var uint8Array =new Uint8Array(2); var dv =new DataView(uint8Array.buffer, 0); dv.setInt16(0, value); return [].slice.call(uint8Array); } function buffer_int32(value) { var uint8Array = new Uint8Array(4); var dv =new DataView(uint8Array.buffer, 0); dv.setInt32(0, value); return [].slice.call(uint8Array); } function buffer_float32(value) { var uint8Array = new Uint8Array(4); var dv = new DataView(uint8Array.buffer, 0); dv.setFloat32(0, value); return [].slice.call(uint8Array); }
socket.js解析
示例報文
默認協議解析
協議規范:標識頭(STR)+長度(4位)+字符串數據
協議實例
STR0086{"key":"sqlreturn","rows":[{"Column1":"2202"}],"taskid":"3","mac":"82-19-34-61-9C-11"}
STR0002ok

測試示例:
574B4C59100080303030303030303198


function ProtocolSample(val) { var out = ''; if (1 == val) { out = '574B4C59100080303030303030303198'; } else if (2 == val) { out = ''; } return out; } function rawDataToProtocol(hex) { var params = {}; var bytes = hex; var head = bytes.substr(0, 8); if ("" == head || 8 != head.length) { return ResponseJson(params, 1, '', ''); } var bagLen = bytes.substr(8, 2); if ("" == bagLen || 2 != bagLen.length) { return ResponseJson(params, 1, '', ''); } bagLen = parseInt(bagLen, 16); // 16進制轉10進制 var board = bytes.substr(10, 2); if ("" == board || 2 != board.length) { return ResponseJson(params, 1, '', ''); } var cmd = bytes.substr(12, 2); if ("" == cmd || 2 != cmd.length) { return ResponseJson(params, 1, '', ''); } var dataLen = (bagLen - 8) * 2; var request = bytes.substr(14, dataLen); if ("" == request || dataLen != request.length) { return ResponseJson(params, 1, '', ''); } var index = 14 + dataLen; var check = bytes.substr(index, 2); if ("" == check || 2 != check.length) { return ResponseJson(params, 1, '', ''); } // var bagstatus = 0; index = index + 2; var remain = bytes.substr(index, 2); if (0 != remain.length) bagstatus = 2; params['head'] = head; params['bagLen'] = bagLen; params['board'] = board; params['cmd'] = cmd; params['request'] = request; params['check'] = check; return ResponseJson(params, bagstatus, (index / 2), '', ''); } function ResponseJson(params, bagstatus, position, uid, data) { var jsonMap = {}; jsonMap['params'] = params; jsonMap['position'] = position; jsonMap['bagstatus'] = bagstatus;// BagNone:0 BagLost:1 BagStick:2 jsonMap['uid'] = uid; jsonMap['data'] = data; return JSON.stringify(jsonMap); } function protocolToRawData(json) { var jsonObject = JSON.parse(json); var method = jsonObject['method']; var params = jsonObject['params']; var temperature = params['temperature']; var payloadArray = []; if (method == PROP_SET_METHOD) //屬性設置 { payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SET)); payloadArray = payloadArray.concat(buffer_int32(temperature)); } return Bytes2Str(payloadArray); } //十六進制字符串轉字節數組 function Str2Bytes(str) { var pos = 0; var len = str.length; if(len %2 != 0) { return null; } len /= 2; var hexA = new Array(); for(var i=0; i<len; i++) { var s = str.substr(pos, 2); var v = parseInt(s, 16); hexA.push(v); pos += 2; } return hexA; } //字節數組轉十六進制字符串 function Bytes2Str(arr) { var str = ""; for(var i=0; i<arr.length; i++) { var tmp = arr[i].toString(16); if(tmp.length == 1) { tmp = "0" + tmp; } str += tmp; } return str; } //以下是部分輔助函數。 function buffer_uint8(value) { var uint8Array = new Uint8Array(1); var dv = new DataView(uint8Array.buffer, 0); dv.setUint8(0, value); return [].slice.call(uint8Array); } function buffer_int16(value) { var uint8Array =new Uint8Array(2); var dv =new DataView(uint8Array.buffer, 0); dv.setInt16(0, value); return [].slice.call(uint8Array); } function buffer_int32(value) { var uint8Array = new Uint8Array(4); var dv =new DataView(uint8Array.buffer, 0); dv.setInt32(0, value); return [].slice.call(uint8Array); } function buffer_float32(value) { var uint8Array = new Uint8Array(4); var dv = new DataView(uint8Array.buffer, 0); dv.setFloat32(0, value); return [].slice.call(uint8Array); }
