阿里云IoT 4:数据解析
数据上报
接收数据
js代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | /** * 将设备自定义topic数据转换为json格式数据, 设备上报数据到物联网平台时调用 * 入参:topic 字符串,设备上报消息的topic * 入参:rawData byte[]数组 不能为空 * 出参:jsonObj JSON对象 不能为空 */ function transformPayload(topic, bytes) { 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); var jsonMap = {}; if (topic.includes(SELF_DEFINE_TOPIC_ERROR_FLAG)) { jsonMap[ 'topic' ] = topic; jsonMap[ 'errorCode' ] = dataView.getInt8(0) } else if (topic.includes(SELF_DEFINE_TOPIC_UPDATE_FLAG)) { jsonMap[ 'topic' ] = topic; jsonMap[ 'prop_int16' ] = dataView.getInt16(5); jsonMap[ 'prop_bool' ] = uint8Array[7]; jsonMap[ 'prop_float' ] = dataView.getFloat32(8); } return jsonMap; } var COMMAND_REPORT = 0x00; //属性上报。 var COMMAND_SET = 0x01; //属性设置。 var COMMAND_REPORT_REPLY = 0x02; //上报数据返回结果。 var COMMAND_SET_REPLY = 0x03; //属性设置设备返回结果。 var COMMAD_UNKOWN = 0xff; //未知的命令。 var ALINK_PROP_REPORT_METHOD = 'thing.event.property.post' ; //物联网平台Topic,设备上传属性数据到云端。 var ALINK_PROP_SET_METHOD = 'thing.service.property.set' ; //物联网平台Topic,云端下发属性控制指令到设备端。 var ALINK_PROP_SET_REPLY_METHOD = 'thing.service.property.set' ; //物联网平台Topic,设备上报属性设置的结果到云端。 var SELF_DEFINE_TOPIC_UPDATE_FLAG = '/user/update' //自定义Topic:/user/update。 var SELF_DEFINE_TOPIC_ERROR_FLAG = '/user/update/error' //自定义Topic:/user/update/error。 /* 示例数据: * 设备上报属性数据 * 输入: 0x000304027500000102 * 输出:{"method":"thing.event.property.post","id":"50594421","params":{"temperature":258},"version":"1.0"} */ function rawDataToProtocol(bytes) { 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(5); // 对应产品属性中temperature // jsonMap[ 'topic' ] = '/user/update_iot' ; jsonMap[ 'method' ] = ALINK_PROP_REPORT_METHOD; //ALink JSON格式,属性上报topic。 jsonMap[ 'version' ] = '1.0' ; //ALink JSON格式,协议版本号固定字段。 jsonMap[ 'id' ] = '' + dataView.getInt32(1); //ALink JSON格式,标示该次请求id值。 jsonMap[ 'params' ] = params; //ALink JSON格式,params标准字段。 } else if (fHead == COMMAND_SET_REPLY) { jsonMap[ 'version' ] = '1.0' ; //ALink JSON格式,协议版本号固定字段。 jsonMap[ 'id' ] = '' + dataView.getInt32(1); //ALink JSON格式,标示该次请求id值。 jsonMap[ 'code' ] = '' + dataView.getUint8(5); jsonMap[ 'data' ] = {}; } return jsonMap; } /** * 将Alink协议的数据转换为设备能识别的格式数据,物联网平台给设备下发数据时调用 * 入参:jsonObj Alink JSON对象 不能为空 * 出参:rawData byte[]数组 不能为空 * * 输入: {"method":"thing.service.property.set","id":"50594421","version":"1.1","params":{"temperature":258}} * 输出: 0x010304027500000102 * */ function protocolToRawData(json) { var method = json[ 'method' ]; var id = json[ 'id' ]; var version = json[ 'version' ]; var payloadArray = []; if (method == ALINK_PROP_SET_METHOD) //属性设置。 { var params = json[ 'params' ]; var temperature = params[ 'temperature' ]; //按照自定义协议格式拼接 rawData。 payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SET)); //command字段。 payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); //ALink JSON格式 'id'。 payloadArray = payloadArray.concat(buffer_int32(temperature)); //属性'temperature'的值。 } return payloadArray; } /** * Test 获取属性值 * * 输入: {"method":"thing.event.property.post","id":"50594421","version":"1.1","params":{"temperature":258}} * 输出: 0x000304027500000102 * */ // function protocolToRawData(json) { // var method = json['method']; // var id = json['id']; // var version = json['version']; // var payloadArray = []; // var params = json['params']; // var temperature = params['temperature']; // payloadArray = payloadArray.concat(buffer_uint8(COMMAND_REPORT)); //command字段。 // payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); //ALink JSON格式 'id'。 // payloadArray = payloadArray.concat(buffer_int32(temperature)); //属性'temperature'的值。 // 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); } |
qq:505645074
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律