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

阿里云物联网平台定义的标准数据格式为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)

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
阿里云物联网平台是一种基于云计算的物联网解决方案,提供了多种相关技术和服务。其中,MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息输协议,通常用于物联网设备之间的通信。 在阿里云物联网平台中,MQTT可以通过3个通道进行数据输。这三个通道可以分别用于输设备状态、设备属性和设备事件。通过这样的数据输,物联网平台可以帮助用户实现对设备的监控、控制、数据采集和分析等功能。 具体来说,MQTT协议是一种基于发布/订阅机制的协议。物联网设备可以通过订阅某个主题,以接收相关的数据消息。同时,设备也可以发布自己的数据消息到指定的主题,供其他设备或应用程序订阅和使用。 在物联网开关领域,MQTT协议可以发挥重要作用。物联网开关是一种可以连接智能设备的装置,例如灯光开关、电源开关等。通过采用MQTT协议,物联网开关可以与其他物联网设备进行通信,接收和发送相关的控制消息。这样的交互可以实现对设备的智能控制和远程管理,提高了设备的便捷性和智能化水平。 总之,阿里云物联网平台的MQTT协议,提供了一种高效的物联网设备通信方式,通过mqtt 3路数据,mqtt协议和物联网开关的结合,可以实现对设备的智能控制和数据输,为物联网应用提供了强大的技术支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值