一、注册阿里云账号登录物联网平台(过程省略)
二、在物联网平台中创建一个高级版透传格式产品
三、为产品添加一个设备(过程根据阿里云文档自行创建)
四、为产品添加功能,如下
五、根据报文内容编写脚本
这里困扰了我好多天,设备端上传得报文(01034042140000)是以字符串的形式传过来的,脚本解析接收的是十六进制数据,因此将报文(01034042140000)转变成了对应的十六进制数(3031303334303432313430303030)。脚本解析的时候本是对十六进制数为(01034042140000)的数据进行解析,而现在却对(3031303334303432313430303030)这些数据进行解析了。现在脚本需要做的是将十六进制(3031303334303432313430303030)转变为十六进制(01034042140000),在对(01034042140000)进行解析。而将十六进制(3031303334303432313430303030)转变为十六进制(01034042140000)的过程我实现不了。所以最后的解析结果虽然没有报错,但物模型数据是不正确的。过程不在叙述,全在代码里。
var COMMAND_REPORT = 0x01;
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'; //标准ALink JSON格式topic, 设备上传属性数据到云端
var ALINK_PROP_SET_METHOD = 'thing.service.property.set'; //标准ALink JSON格式topic, 云端下发属性控制指令到设备端
var ALINK_PROP_SET_REPLY_METHOD = 'thing.service.property.set'; //标准ALink JSON格式topic, 设备上报属性设置的结果到云端
//上行数据,自定义二进制转物模型json
function rawDataToProtocol(bytes) {
var tstr=[];
for (var i = 0; i < bytes.length; i++) {
tstr += String.fromCharCode(parseInt(bytes[i], 10))
}
//tstr=parseInt(tstr,10);
var uint8Array = new Uint8Array(tstr.length);
for (var i = 0; i <tstr.length; i++) {
uint8Array[i] = parseInt(tstr.substr(2*i, 2), 16) & 0xff;
}
var dataView = new DataView(uint8Array.buffer, 0);
var jsonMap = new Object();
var fHead = uint8Array[0]; // command
if (fHead == COMMAND_REPORT) {
//属性上报method
jsonMap['method'] = ALINK_PROP_REPORT_METHOD;
//协议版本号固定字段
jsonMap['version'] = '1.0';
//标示该次请求id值
jsonMap['id'] =dataView.getInt32(1);
var params = {};
//对应产品属性中 temperature
params['temperature'] = dataView.getFloat32(3);
//对应产品属性中 humidity
params['humidity'] = dataView.getFloat32(7);
jsonMap['params'] = params;
}
return jsonMap;
}
//下行指令,物模型json转二进制格式
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 prop_float = params['prop_float'];
var prop_int16 = params['prop_int16'];
//var prop_bool = params['prop_bool'];
//按照自定义协议格式拼接 rawData
payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SET)); // command字段
payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); // ALink JSON格式 'id'
payloadArray = payloadArray.concat(buffer_int16(prop_int16)); // 属性'prop_int16'的值
// payloadArray = payloadArray.concat(buffer_uint8(prop_bool)); // 属性'prop_bool'的值
// payloadArray = payloadArray.concat(buffer_float32(prop_float)); // 属性'prop_float'的值
} else if (method == ALINK_PROP_REPORT_METHOD) { //设备上报数据返回结果
var code = json['code'];
payloadArray = payloadArray.concat(buffer_uint8(COMMAND_REPORT_REPLY)); //command字段
payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); // ALink JSON格式 'id'
payloadArray = payloadArray.concat(buffer_uint8(code));
} else { //未知命令,对于有些命令不做处理
var code = json['code'];
payloadArray = payloadArray.concat(buffer_uint8(COMMAD_UNKOWN)); //command字段
payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); // ALink JSON格式 'id'
payloadArray = payloadArray.concat(buffer_uint8(code));
}
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);
}
五、运行结果
最后如果大家有什么疑问,都会尽力解答。