阿里云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);
}

  

posted @   CHHC  阅读(1697)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示