MQTT自定义透传_DTU连接阿里云
2023-04-18 16:48:02 时间
阿里云物联网平台定义的标准数据格式为Alink JSON。对于低配置且资源受限或者对网络流量有要求的设备,不适合直接构造JSON数据与物联网平台通信,可将原数据透传到物联网平台。物联网平台提供数据解析功能,可以根据您提交的脚本,将数据在设备自定义格式和JSON格式之间转换。
自定义透传适合的场景为采用廉价单片机、功能比较弱的DTU方案,这些DTU对json这种格式解析可能比较费劲。
一、新建产品
1.新建产品
我们选择“自定义品类”,节点类型为“直连设备”,最重要的是数据格式一定要选择“透传/自定义”。
2.添加功能
3.编写解析脚本
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, 云端 下发属性控制指令 到设备端
/**
* 将设备自定义topic数据转换为json格式数据, 设备上报数据到物联网平台时调用
* 入参:topic string 设备上报消息的topic
* 入参:rawData byte[]数组 不能为空
* 出参:jsonObj JSON对象 不能为空
*/
function transformPayload(topic, rawData) {
var jsonObj = {};
return jsonObj;
}
/**
* 将设备的自定义格式数据转换为Alink协议的数据,设备上报数据到物联网平台时调用
* 入参:bytes byte[]数组 不能为空
* 出参:jsonMap Alink JSON对象 不能为空
*/
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;
}
/**
* 将Alink协议的数据转换为设备能识别的格式数据,物联网平台给设备下发数据时调用
* 入参:json Alink JSON对象 不能为空
* 出参:payloadArray byte[]数组 不能为空
*
*/
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);
}
// 以下为脚本模版,您可以基于以下模版进行脚本编写
/**
* 将设备自定义topic数据转换为json格式数据, 设备上报数据到物联网平台时调用
* 入参:topic string 设备上报消息的topic
* 入参:rawData byte[]数组 不能为空
* 出参:jsonObj JSON对象 不能为空
*/
/* function transformPayload(topic, rawData) {
var jsonObj = {};
return jsonObj;
} */
/**
* 将设备的自定义格式数据转换为Alink协议的数据,设备上报数据到物联网平台时调用
* 入参:rawData byte[]数组 不能为空
* 出参:jsonObj Alink JSON对象 不能为空
*/
/* function rawDataToProtocol(rawData) {
var jsonObj = {};
return jsonObj;
} */
/**
* 将Alink协议的数据转换为设备能识别的格式数据,物联网平台给设备下发数据时调用
* 入参:jsonObj Alink JSON对象 不能为空
* 出参:rawData byte[]数组 不能为空
*
*/
/* function protocolToRawData(jsonObj) {
var rawdata = [];
return rawdata;
}
*/
二、配置dtu
如下图所示记录好平台的如下几个连接参数
ProductKey
DeviceName
DeviceSecret
mqttHostUrl
port
订阅Topic
发布Topic
我们要用到的topic为物模型通信Topic,打开产品详情,并选择Topic类列表-物模型通信Topic,我们需要的是下面红框内的这两个topic
配置DUT三要素及通信参数
按如下次序操作设置DTU,并将上面记录的通信参数对应填入。
三、测试上传
先发一个初始数据000320f2e30000000001(注意使用十六进制发送)
阿里云状态变更
上报一条新的000320f2e30000000500
状态立即更新
四、测试下发
找到监控运维,在线调试,我们在属性调试内设置好属性数据然后点击“设置”下发一条指令
设备端收到的数据如下(注意:记得选择十六进制显示不然是乱码)
本文参考自:dtu阿里云自定义透传 (openluat.com)
相关文章
- 直接在代码里面对list集合进行分页
- .NET Framework 4.5新特性详解
- 大数据的简要介绍
- 大数据的由来
- 高斯混合模型的自然梯度变量推理
- timing-wheel 仿Kafka实现的时间轮算法
- 使用Navicat软件连接自建数据库(Linux系统)
- 那一天,我被Redis主从架构支配的恐惧
- Redis 深入了解键的过期时间
- C#使用委托调用实现用户端等待闪屏
- 基于流计算 Oceanus 和 Elasticsearch Service 构建百亿级实时监控系统
- GRAND | 转录调控网络预测数据库
- JFreeChart API中文文档
- 临床相关突变查询数据库
- TIGER | 人类胰岛基因变化查询数据库
- 视频边缘计算网关EasyNVR在视频整体监控解决方案中的应用分析
- Apache Arrow - 大数据在数据湖后的下一个风向标
- 常见的电商数据指标体系
- AKShare-艺人数据-艺人流量价值
- MySQL中多表联合查询与子查询的这些区别,你可能不知道!