ToB企服应用市场:ToB评测及商务社交产业平台

标题: MQTT自定义透传_DTU毗连阿里云 [打印本页]

作者: 滴水恩情    时间: 2024-8-5 17:31
标题: MQTT自定义透传_DTU毗连阿里云
阿里云物联网平台定义的尺度数据格式为Alink JSON。对于低配置且资源受限或者对网络流量有要求的设备,不适合直接构造JSON数据与物联网平台通信,可将原数据透传到物联网平台。物联网平台提供数据分析功能,可以根据您提交的脚本,将数据在设备自定义格式和JSON格式之间转换。

自定义透传适合的场景为采用便宜单片机、功能比较弱的DTU方案,这些DTU对json这种格式分析可能比较费劲。

一、新建产品

1.新建产品
我们选择“自定义品类”,节点范例为“直连设备”,最重要的是数据格式肯定要选择“透传/自定义”。


 2.添加功能


 3.编写分析脚本

 
  1. var COMMAND_REPORT = 0x00;
  2. var COMMAND_SET = 0x01;
  3. var ALINK_PROP_REPORT_METHOD = 'thing.event.property.post'; //标准ALink JSON格式topic, 设备 上传属性数据到 云端
  4. var ALINK_PROP_SET_METHOD = 'thing.service.property.set'; //标准ALink JSON格式topic, 云端 下发属性控制指令 到设备端
  5. /**
  6. * 将设备自定义topic数据转换为json格式数据, 设备上报数据到物联网平台时调用
  7. * 入参:topic   string 设备上报消息的topic
  8. * 入参:rawData byte[]数组 不能为空
  9. * 出参:jsonObj JSON对象 不能为空
  10. */
  11. function transformPayload(topic, rawData) {
  12.         var jsonObj = {};
  13.         return jsonObj;
  14. }   
  15. /**
  16. * 将设备的自定义格式数据转换为Alink协议的数据,设备上报数据到物联网平台时调用
  17. * 入参:bytes byte[]数组 不能为空
  18. * 出参:jsonMap Alink JSON对象 不能为空
  19. */
  20. function rawDataToProtocol(bytes) {
  21.         var uint8Array = new Uint8Array(bytes.length);
  22.         for (var i = 0; i < bytes.length; i++) {
  23.                 uint8Array[i] = bytes[i] & 0xff;
  24.         }
  25.         var dataView = new DataView(uint8Array.buffer, 0);
  26.         var jsonMap = new Object();
  27.         var fHead = uint8Array[0];
  28.         if (fHead == COMMAND_REPORT) {
  29.                 jsonMap['method'] = ALINK_PROP_REPORT_METHOD;
  30.                 jsonMap['version'] = '1.0';
  31.                 jsonMap['id'] = '' + dataView.getInt32(1);
  32.                 var params = {};
  33.                 params['LightVolt'] = dataView.getInt32(5);
  34.                 params['PowerSwitch'] = uint8Array[9];
  35.                 jsonMap['params'] = params;
  36.         }
  37.         return jsonMap;
  38. }
  39. /**
  40. *  将Alink协议的数据转换为设备能识别的格式数据,物联网平台给设备下发数据时调用
  41. *  入参:json Alink JSON对象  不能为空
  42. *  出参:payloadArray byte[]数组      不能为空
  43. *
  44. */
  45. function protocolToRawData(json) {
  46.         var method = json['method'];
  47.         var id = json['id'];
  48.         var version = json['version'];
  49.         var payloadArray = [];
  50.         if (method == ALINK_PROP_SET_METHOD)
  51.         {
  52.             var params = json['params'];
  53.             var prop_int32 = params['LightVolt'];
  54.             var prop_bool = params['PowerSwitch'];
  55.             //按照自定义协议格式拼接 rawdata
  56.             payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SET));
  57.             payloadArray = payloadArray.concat(buffer_int32(parseInt(id)));
  58.             payloadArray = payloadArray.concat(buffer_int32(parseInt(prop_int32)));
  59.             payloadArray = payloadArray.concat(buffer_uint8(prop_bool));
  60.         }
  61.         return payloadArray;
  62.     }
  63. //以下是部分辅助函数
  64. function buffer_uint8(value) {
  65.     var uint8Array = new Uint8Array(1);
  66.     var dv = new DataView(uint8Array.buffer, 0);
  67.     dv.setUint8(0, value);
  68.     return [].slice.call(uint8Array);
  69. }
  70. function buffer_int16(value) {
  71.     var uint8Array = new Uint8Array(2);
  72.     var dv = new DataView(uint8Array.buffer, 0);
  73.     dv.setInt16(0, value);
  74.     return [].slice.call(uint8Array);
  75. }
  76. function buffer_int32(value) {
  77.     var uint8Array = new Uint8Array(4);
  78.     var dv = new DataView(uint8Array.buffer, 0);
  79.     dv.setInt32(0, value);
  80.     return [].slice.call(uint8Array);
  81. }
  82. function buffer_float32(value) {
  83.     var uint8Array = new Uint8Array(4);
  84.     var dv = new DataView(uint8Array.buffer, 0);
  85.     dv.setFloat32(0, value);
  86.     return [].slice.call(uint8Array);
  87. }
  88. // 以下为脚本模版,您可以基于以下模版进行脚本编写
  89. /**
  90. * 将设备自定义topic数据转换为json格式数据, 设备上报数据到物联网平台时调用
  91. * 入参:topic   string 设备上报消息的topic
  92. * 入参:rawData byte[]数组 不能为空
  93. * 出参:jsonObj JSON对象 不能为空
  94. */
  95. /* function transformPayload(topic, rawData) {
  96.     var jsonObj = {};
  97.     return jsonObj;
  98. } */
  99. /**
  100. * 将设备的自定义格式数据转换为Alink协议的数据,设备上报数据到物联网平台时调用
  101. * 入参:rawData byte[]数组 不能为空
  102. * 出参:jsonObj Alink JSON对象 不能为空
  103. */
  104. /* function rawDataToProtocol(rawData) {
  105.     var jsonObj = {};
  106.     return jsonObj;
  107. } */
  108. /**
  109. *  将Alink协议的数据转换为设备能识别的格式数据,物联网平台给设备下发数据时调用
  110. *  入参:jsonObj Alink JSON对象  不能为空
  111. *  出参:rawData byte[]数组      不能为空
  112. *
  113. */
  114. /* function protocolToRawData(jsonObj) {
  115.     var rawdata = [];
  116.     return rawdata;
  117. }
  118. */
复制代码

二、配置dtu

如下图所示记录好平台的如下几个毗连参数

ProductKey

DeviceName

DeviceSecret

mqttHostUrl

port

订阅Topic

发布Topic


  

我们要用到的topic为物模子通信Topic,打开产品详情,并选择Topic类列表-物模子通信Topic,我们须要的是下面红框内的这两个topic


 

配置DUT三要素及通信参数
按如下序次操作设置DTU,并将上面记录的通信参数对应填入。

 
三、测试上传

先发一个初始数据000320f2e30000000001(注意使用十六进制发送)


 阿里云状态变更


 上报一条新的000320f2e30000000500


 状态立即更新


 

四、测试下发

找到监控运维,在线调试,我们在属性调试内设置好属性数据然后点击“设置”下发一条指令


 
设备端收到的数据如下(注意:记得选择十六进制显示否则是乱码)


 本文参考自:dtu阿里云自定义透传 (openluat.com)


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4