滴水恩情 发表于 2024-8-5 17:31:43

MQTT自定义透传_DTU毗连阿里云

阿里云物联网平台定义的尺度数据格式为Alink JSON。对于低配置且资源受限或者对网络流量有要求的设备,不适合直接构造JSON数据与物联网平台通信,可将原数据透传到物联网平台。物联网平台提供数据分析功能,可以根据您提交的脚本,将数据在设备自定义格式和JSON格式之间转换。
自定义透传适合的场景为采用便宜单片机、功能比较弱的DTU方案,这些DTU对json这种格式分析可能比较费劲。
一、新建产品

1.新建产品
我们选择“自定义品类”,节点范例为“直连设备”,最重要的是数据格式肯定要选择“透传/自定义”。
https://i-blog.csdnimg.cn/blog_migrate/c14cdc1512a056eb4c0cac50b5f7aab3.png
 2.添加功能

https://i-blog.csdnimg.cn/blog_migrate/e42637e614f7bc1f3923ba465e3b4b70.png
 3.编写分析脚本
https://i-blog.csdnimg.cn/blog_migrate/89f5a77c7296e78d5219b57a9cc52145.png
 
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 = bytes & 0xff;
        }
        var dataView = new DataView(uint8Array.buffer, 0);
        var jsonMap = new Object();
        var fHead = uint8Array;
        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;
                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
https://i-blog.csdnimg.cn/blog_migrate/f44a98f61b6965f7eb745b61e32b05f7.png
https://i-blog.csdnimg.cn/blog_migrate/f465d0363b90485bd0ec18c962de050f.png  

我们要用到的topic为物模子通信Topic,打开产品详情,并选择Topic类列表-物模子通信Topic,我们须要的是下面红框内的这两个topic
https://i-blog.csdnimg.cn/blog_migrate/1cd325cdaaa86953de8fe537347322e2.png
 

配置DUT三要素及通信参数
按如下序次操作设置DTU,并将上面记录的通信参数对应填入。
https://i-blog.csdnimg.cn/blog_migrate/1590a2de5c5b6bdde806231170f22b3b.png
 
三、测试上传

先发一个初始数据000320f2e30000000001(注意使用十六进制发送)
https://i-blog.csdnimg.cn/blog_migrate/99423af690463a2647e0849e38c8d052.png
 阿里云状态变更

https://i-blog.csdnimg.cn/blog_migrate/8631bba2bd7e6ddd7cc7efc53484931e.png
 上报一条新的000320f2e30000000500

https://i-blog.csdnimg.cn/blog_migrate/799b80aa04522c9baa68ed0db42f1485.png
 状态立即更新

https://i-blog.csdnimg.cn/blog_migrate/0a16b9095633d97fe90a8b01237c38c8.png
 

四、测试下发

找到监控运维,在线调试,我们在属性调试内设置好属性数据然后点击“设置”下发一条指令
https://i-blog.csdnimg.cn/blog_migrate/5d06f6d53141e0ff79a928ba674cafe3.png
 
设备端收到的数据如下(注意:记得选择十六进制显示否则是乱码)
https://i-blog.csdnimg.cn/blog_migrate/ef9340ceed7facd0f80aa4ed3c3881f4.png
 本文参考自:dtu阿里云自定义透传 (openluat.com)


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: MQTT自定义透传_DTU毗连阿里云