<!DOCTYPE html> <html> <head> <script type="text/javascript"> var prop_FreeNum_post = 0x21; var prop_Content_post = 0x22; var event_ContentChanged_post = 0x06; var ALINK_PROP_POST_METHOD = 'thing.event.property.post'; var ALINK_EVENT_POST_HeartbeatNotification_METHOD = "thing.event.HeartbeatNotification.post"; var ALINK_EVENT_POST_ContentChanged_METHOD = "thing.event.ContentChanged.post"; var ALINK_SERVEICE_POST_DistributeFreeNum_METHOD = "thing.service.DistributeFreeNum"; var ALINK_SERVEICE_POST_DistributeContent_METHOD = "thing.service.DistributeContent"; function rawDataToProtocol(bytes) { var derective; var strBytes=byteToString(bytes); var jsonObj = JSON.parse(strBytes); var data = null; if (jsonObj.hasOwnProperty("data")) { data = jsonObj["data"]; console.log("gbkHex="+data); } var jsonMap = new Object(); var params = {}; if(data==null){ jsonMap['method'] = ALINK_EVENT_POST_HeartbeatNotification_METHOD; jsonMap['params'] = params; }else if(data=="Bg=="){ jsonMap['method'] = ALINK_EVENT_POST_ContentChanged_METHOD; params['Content'] = "收到应答"; params['ChangeTime'] ="0"; jsonMap['params'] = params; }else if(data=="/w=="){ jsonMap['method'] = ALINK_EVENT_POST_ContentChanged_METHOD; params['Content'] = "收到应答"; params['ChangeTime'] ="0"; jsonMap['params'] = params; }else{ var cmd = jsonObj["cmd"]; var bData = base64Decode(data); var uint8Array = new Uint8Array(bData.length); for (var i = 0; i < bData.length; i++) { uint8Array[i] = bData[i] & 0xff; } var dataView = new DataView(uint8Array.buffer, 0); derective = uint8Array[1]; jsonMap['version'] = '1.0'; if(cmd=="dData"){ if(derective==prop_FreeNum_post){ jsonMap['method'] = ALINK_PROP_POST_METHOD; jsonMap['id'] = "1"; var count = ""; for (var i = 15; i < bData.length-1; i++) { count=count +String.fromCharCode(bData[i]); } params['FreeNum'] =parseInt(count); jsonMap['params'] = params; }else if(derective==prop_Content_post){ jsonMap['method'] = ALINK_PROP_POST_METHOD; var gbkHex = []; for (var i = 10; i < bData.length-1; i++) { gbkHex=gbkHex.concat(bData[i]); } var gbkHexStr = Bytes2HexStr(gbkHex); params['Content'] = gbkHexStr; jsonMap['params'] = params; }else if(derective==event_ContentChanged_post){ jsonMap['method'] = ALINK_EVENT_POST_ContentChanged_METHOD; var gbkHex = []; for (var i = 10; i < bData.length-1; i++) { gbkHex=gbkHex.concat(bData[i]); } var gbkHexStr = Bytes2HexStr(gbkHex); params['Content'] = gbkHexStr; params['ChangeTime'] ="0"; jsonMap['params'] = params; } }else if(cmd=="dHeartbeat"){ jsonMap['method'] = ALINK_EVENT_POST_HeartbeatNotification_METHOD; jsonMap['params'] = params; } } return jsonMap; } function protocolToRawData(json) { var method = json['method']; var id = json['id']; var version = json['version']; var payloadArray = []; if (method == ALINK_PROP_POST_METHOD) { payloadArray = payloadArray.concat([0x5D,0x0A,0x00]); } else if (method == ALINK_SERVEICE_POST_DistributeFreeNum_METHOD) { payloadArray = payloadArray.concat([0x5D,0x0A,0x00]); var params = json['params']; var FreeNum = params["FreeNum"]; FreeNum = "" + FreeNum; var chars = stringToChars(FreeNum); payloadArray=payloadArray.concat(stringToByte('{"cmd": "uData","mode":"RS485","baud":"19200","byteSize":"8","parity":"even","stopbits":"1","waitTime": "500","data":"')); var data1=[0x02,0x21,0x25,0x20,0x0C,0x35,0x20,0x22,0x35,0x27,0xD3,0xE0,0xCE,0xBB,0x3A]; data1=data1.concat(chars); data1=data1.concat([0x03]); var count=data1.length-11+32; data1[9] = count; var base64Data1=base64Encode(data1); payloadArray=payloadArray.concat(stringToByte(base64Data1)); payloadArray=payloadArray.concat(stringToByte('","data1":"')); var data2=[0x02,0x21,0x24,0x20,0x03]; var base64Data2=base64Encode(data2); payloadArray=payloadArray.concat(stringToByte(base64Data2)); payloadArray=payloadArray.concat(stringToByte('","rdata":"')); payloadArray=payloadArray.concat(stringToByte(base64Data1)); payloadArray=payloadArray.concat(stringToByte('"}')); } else if (method == ALINK_SERVEICE_POST_DistributeContent_METHOD) { payloadArray = payloadArray.concat([0x5D,0x0A,0x00]); var params = json['params']; var Content = params["Content"]; var gbkbytes = HexString2Bytes(Content); payloadArray=payloadArray.concat(stringToByte('{"cmd": "uData","mode":"RS485","baud":"19200","byteSize":"8","parity":"even","stopbits":"1","waitTime": "500","data":"')); var data1=[0x02,0x22,0x25,0x20,0x0C,0x35,0x20,0x22,0x35,0x2A]; data1=data1.concat(gbkbytes); data1=data1.concat([0x03]); var count=data1.length-11+32; data1[9] = count; var base64Data1=base64Encode(data1); payloadArray=payloadArray.concat(stringToByte(base64Data1)); payloadArray=payloadArray.concat(stringToByte(base64Data1)); payloadArray=payloadArray.concat(stringToByte('","data1":"')); var data2=[0x02,0x22,0x24,0x20,0x03]; var base64Data2=base64Encode(data2); payloadArray=payloadArray.concat(stringToByte(base64Data2)); payloadArray=payloadArray.concat(stringToByte('","rdata":"')); payloadArray=payloadArray.concat(stringToByte(base64Data1)); payloadArray=payloadArray.concat(stringToByte('","rdata1":"')); var data3=[0x02,0x06,0x25,0x20,0x0C,0x35,0x20,0x22,0x35,0x2A]; data3=data3.concat(gbkbytes); data3=data3.concat([0x03]); var count=data3.length-11+32; data3[9] = count; var base64Data3=base64Encode(data3); payloadArray=payloadArray.concat(stringToByte(base64Data3)); payloadArray=payloadArray.concat(stringToByte('"}')); } else if(method == ALINK_EVENT_POST_ContentChanged_METHOD){ payloadArray = payloadArray.concat([0x5D,0x0A,0x00]); } else if(method == ALINK_EVENT_POST_HeartbeatNotification_METHOD){ payloadArray = payloadArray.concat([0x5D,0x0A,0x00]); } return payloadArray; } //以下是部分辅助函数 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); } function stringToChars(str){ var chars = []; for(var i=0;i<str.length;i++){ chars=chars.concat(str.charCodeAt(i)); } return chars; } function gbkEncode(str) { return str.replace(/./g, function (a) { var code = a.charCodeAt(0); if (isAscii(code)) { return encodeURIComponent(a); } else { var key = code.toString(16); if (key.length != 4)key = ('000' + key).match(/....$/)[0]; return U2Ghash[key] || a; } }); } function gbkDecode(str, callback) { return str.replace(/%[0-9A-F]{2}%[0-9A-F]{2}/g, function (a) { if (a in G2Uhash) { return String.fromCharCode('0x' + G2Uhash[a]); } else { return a; } }).replace(/%[\w]{2}/g, function (a) { return decodeURIComponent(a); }); } function stringToByte(str) { var bytes = new Array(); var len, c; len = str.length; for(var i = 0; i < len; i++) { c = str.charCodeAt(i); if(c >= 0x010000 && c <= 0x10FFFF) { bytes.push(((c >> 18) & 0x07) | 0xF0); bytes.push(((c >> 12) & 0x3F) | 0x80); bytes.push(((c >> 6) & 0x3F) | 0x80); bytes.push((c & 0x3F) | 0x80); } else if(c >= 0x000800 && c <= 0x00FFFF) { bytes.push(((c >> 12) & 0x0F) | 0xE0); bytes.push(((c >> 6) & 0x3F) | 0x80); bytes.push((c & 0x3F) | 0x80); } else if(c >= 0x000080 && c <= 0x0007FF) { bytes.push(((c >> 6) & 0x1F) | 0xC0); bytes.push((c & 0x3F) | 0x80); } else { bytes.push(c & 0xFF); } } return bytes; } function byteToString(arr) { if(typeof arr === 'string') { return arr; } var str = '', _arr = arr; for(var i = 0; i < _arr.length; i++) { var one = _arr[i].toString(2), v = one.match(/^1+?(?=0)/); if(v && one.length == 8) { var bytesLength = v[0].length; var store = _arr[i].toString(2).slice(7 - bytesLength); for(var st = 1; st < bytesLength; st++) { store += _arr[st + i].toString(2).slice(2); } str += String.fromCharCode(parseInt(store, 2)); i += bytesLength - 1; } else { str += String.fromCharCode(_arr[i]); } } return str; } //16进制串转字节数组 function HexString2Bytes(str) { var pos = 0; var len = str.length; if (len % 2 != 0) { return null; } len /= 2; var arrBytes = new Array(); for (var i = 0; i < len; i++) { var s = str.substr(pos, 2); var v = parseInt(s, 16); arrBytes.push(v); pos += 2; } return arrBytes; } 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 Bytes2HexStr(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 base64Encode(input) { var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; while (i < input.length) { chr1 = input[i++]; chr2 = input[i++]; chr3 = input[i++]; enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output +_keyStr.charAt(enc1) + _keyStr.charAt(enc2) +_keyStr.charAt(enc3) + _keyStr.charAt(enc4); } return output; } function base64Decode(input) { var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var output = []; var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0; while(i<input.length){ enc1 = _keyStr.indexOf(input.charAt(i++)); enc2 = _keyStr.indexOf(input.charAt(i++)); enc3 = _keyStr.indexOf(input.charAt(i++)); enc4 = _keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output.concat(chr1); if (enc3 != 64) { output = output.concat(chr2); } if (enc4 != 64) { output = output.concat(chr3); } } return output; } function encodeUtf8(text) { const code = encodeURIComponent(text); const bytes = []; for (var i = 0; i < code.length; i++) { const c = code.charAt(i); if (c === '%') { const hex = code.charAt(i + 1) + code.charAt(i + 2); const hexVal = parseInt(hex, 16); bytes.push(hexVal); i += 2; } else bytes.push(c.charCodeAt(0)); } return bytes; } function decodeUtf8(bytes) { var encoded = ""; for (var i = 0; i < bytes.length; i++) { encoded += '%' + bytes[i].toString(16); } return decodeURIComponent(encoded); } window.onload=function(){ //7461223a224169456c49417731494349314b6450677a7273364d5441774d514d3d227d //var ss1=stringToByte('{"cmd":"dData","snr":"2018121400001","mode":"RS485","data":"AiElIAw1ICI1KdPgzrs6MTAwMQM="}'); // var ssss1 = rawDataToProtocol(ss1) //console.log(ssss1); //7b22636d64223a226444617461222c22736e72223a2232303138313231343030303031222c226d6f6465223a225253343835222c2264617461223a224169496c49417731494349314b383630774c532f7872793873386344227d //var ss2=stringToByte('{"cmd":"dData","snr":"2018121400001","mode":"RS485","data":"AiIlIAw1ICI1K860wLS/xry8s8cD"}'); //var ssss2 = rawDataToProtocol(ss2) //console.log(ssss2); //7b22636d64223a226444617461222c22736e72223a2232303138313231343030303031222c226d6f6465223a225253343835222c2264617461223a224167596c49417731494349314b383630774c532f7872793873386344227d var ss22=stringToByte('{"cmd":"dData","snr":"2018121400001","mode":"RS485","data":"AgYlIAw1ICI1K860wLS/xry8s8cD"}'); var ssss22 = rawDataToProtocol(ss22) console.log(ssss22); //7b22636d64223a226444617461222c22736e72223a2232303138313231343030303031222c226d6f6465223a225253343835222c2264617461223a2242673d3d227d //var ss3=stringToByte('{"cmd":"dData","snr":"2018121400001","mode":"RS485","data":"Bg=="}'); //var ssss3 = rawDataToProtocol(ss3) //console.log(ssss3); //7b22636d64223a2264486561727462656174222c22736e72223a2232303138313231343030303031222c226e616d65223a2230303030303030303030227d //var ss4=stringToByte('{"cmd":"dHeartbeat","snr":"2018121400001","name":"0000000000"}'); //var ssss4 = rawDataToProtocol(ss4) //console.log(ssss4); var json={ "aliyunPk": "1110040395217519", "device": { "activeTime": 1550480801000, "aliyunCommodityCode": "iothub_senior", "deviceKey": "Tb2D7lwqy1C6dUt7lAkZ", "deviceSecret": "***", "gmtCreate": 1550458407000, "gmtModified": 1550480800000, "id": 30062328, "iotId": "Tb2D7lwqy1C6dUt7lAkZ000100", "name": "d896e0ff00010b86", "productKey": "a1fAGvnduAT", "rbacTenantId": "A298D6EEC4754EFAA2AF6089BDA46AD3", "region": "cn-shanghai", "status": 1, "statusLast": 0, "thingType": "DEVICE" }, "id": "260589046", "iotId": "Tb2D7lwqy1C6dUt7lAkZ000100", "method": "thing.service.DistributeFreeNum", "params": { "FreeNum": 1000 } }; //var bytes = protocolToRawData(json) // var str2 = Bytes2Str(bytes); // console.log(bytes); // console.log(str2); var json2={ "aliyunPk": "1110040395217519", "device": { "activeTime": 1550480801000, "aliyunCommodityCode": "iothub_senior", "deviceKey": "Tb2D7lwqy1C6dUt7lAkZ", "deviceSecret": "***", "gmtCreate": 1550458407000, "gmtModified": 1550480800000, "id": 30062328, "iotId": "Tb2D7lwqy1C6dUt7lAkZ000100", "name": "d896e0ff00010b86", "productKey": "a1fAGvnduAT", "rbacTenantId": "A298D6EEC4754EFAA2AF6089BDA46AD3", "region": "cn-shanghai", "status": 1, "statusLast": 0, "thingType": "DEVICE" }, "id": "260589046", "iotId": "Tb2D7lwqy1C6dUt7lAkZ000100", "method": "thing.service.DistributeContent", "params": { "Content": "C4B3C4B3CDA3B3B5B3A1A3ACBBB6D3AD" } }; //var bytes2 = protocolToRawData(json2) // var str22 = Bytes2Str(bytes2); // console.log(bytes2); // console.log(str22); } </script> </head> <body></body> </html>