由于控制dtu的单片机可能是非常便宜功能很弱,所以对json这种格式解析可能比较费劲,所以阿里云在高级版中为客户提供了自定义格式的数据透传解析服务。用户可以方便的使用十六进制等数据格式上传,由于我们的dtu可以方便的实现对阿里云的透传,所以开发起来也很简单。
1,阿里云新建产品
为了和以前的功能统一这次还是用的自定义,大家可以根据需要自己选择,重要的是数据格式一定要选择自定义透传。
添加功能
编写解析脚本
var COMMAND_REPORT = 0x00;
var COMMAND_SET = 0x01;
var ALINK_PROP_REPORT_METHOD = 'thing.event.property.post'; //标准ALink JSON格式topic, 设备 上传属性数据到 云端
var ALINK_PROP_SET_METHOD = 'thing.service.property.set'; //标准ALink JSON格式topic, 云端 下发属性控制指令 到设备端
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);
var jsonMap = new Object();
var fHead = uint8Array[0];
if (fHead == COMMAND_REPORT) {
jsonMap['method'] = ALINK_PROP_REPORT_METHOD;
jsonMap['version'] = '1.0';
jsonMap['id'] = '' + dataView.getInt32(1);
var params = {};
params['LightVolt'] = dataView.getInt32(5);
params['PowerSwitch'] = uint8Array[9];
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_SET_METHOD)
{
var params = json['params'];
var prop_int32 = params['LightVolt'];
var prop_bool = params['PowerSwitch'];
//按照自定义协议格式拼接 rawdata
payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SET));
payloadArray = payloadArray.concat(buffer_int32(parseInt(id)));
payloadArray = payloadArray.concat(buffer_int32(parseInt(prop_int32)));
payloadArray = payloadArray.concat(buffer_uint8(prop_bool));
}
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);
}
脚本是根据功能编写的,具体方法可以看传送门,脚本有不明白或需要帮助可以私信我,也可以在dtu群里问我(dtu群名片和在这里的网名一样)。
2,配置dtu
这次我们用到的topic和以前不同,上面给出的链接中有具体说明,看我们的产品,我们需要的是这两个topic
和以前配置方法一样,修改参数保存即可
3,测试上传
先发一个初始数据000320f2e30000000001(注意使用十六进制发送)
阿里云状态变更
上报一条新的000320f2e30000000500
状态立即更新
4,测试下发
找到运维监控,在线调试,我们模拟下发一条指令
设备端(注意:记得选择十六进制显示不然是乱码)
设置电源为1,发送
设备
5,总结
自定义透传可以灵活的使用单片机组织报文,通过阿里云脚本进行解析,减小了设备端压力,方便了开发。同时使用16进制报文极大的减小了流量开支,只需要以前十分之一甚至百分之一的流量,降低了成本。