场景简介
在工业、农业、商业、园区、楼宇存在着大量通过DTU采集南向设备接入物联网平台的应用场景,这些场景的设备一般需要通过DTU透传上云。本示例主要展示通过有人G771 Cat.1 DTU如何接入腾讯云物联网开发平台实现数据的收发,然后会进阶接入温湿度传感器完成温湿度上报到物联网开发平台。本实践整体网络拓扑图如下图所示:
环境准备
1. 所需设备/软件
设备/软件 | 获取地址 | 备注 |
有人DTU一台 | 其他品牌的 DTU 也可以 | |
DTU上位机配置软件 | 其他平台的 DTU 请对应找相关的配置上位机 | |
USB转RS485一个 | 自备 | - |
12V/1A电源适配器一个 | 自备 | 给 DTU 供电 |
2. 设备联网
2.1 正确安装 4G 天线,将 USB 转 RS485 和电源线接入对应端子,确保接线无误,给设备上电。硬件接线示意图如下:
2.2 设备正常上电后,红色的POW指示灯会亮起,G771型DTU内置的eSIM卡,上电后可以扫描DTU上的二维码,使用微信小程序配置,这里先选择默认配置即可。
3. 注册有人云账号,查看设备基础信息。
3.1 通过上一步扫描设备上的二维码,这时就可以登录有人云的控制台,查看当前这台设备的基础信息:
3.2 点击更多->编辑->关闭数据透传功能。
创建产品与设备
1. 登录腾讯云物联网开发平台控制台。
2. 点击公共实例->新建项目->保存。
3. 点击进入上一步新建的项目,点击新建产品,进入新建产品界面。
注意:
这里的数据协议需要选择自定义透传。
4. 点击设备调试-->新建设备,设备名称可以自定义,这里建议使用当前DTU的IMEI作为设备名,方便后期对设备管理。
5. 至此,我们拿到了设备的三元组信息,可以据此生成MQTT连接参数。
注意:
连接平台
1. PC连接USB转RS485工具,在设备管理器会枚举出一个新的COM口,打开有人物联网上位机配置工具,连接此COM口,默认串口连接参数:115200,8,N,1;连接成功后先点击进入配置状态,然后点击查询IMEI,如果能正确查询到IMEI码,则表明硬件连接正常可以进入下一步的配置,如果查不到IMEI码则可能是硬件连接故障,请自行排查接线、供电、串口驱动等问题。
2. 配置MQTT连接参数,测试阶段可以使用腾讯云物联网开发平台控制台生成的MQTT连接参数。
注意:
工作模式选择MQTT模式,MQTT相关参数请直接复制粘贴腾讯云物联网开发平台的MQTT连接参数。
3. 订阅/发布腾讯云物联网开发平台的raw topic。
注意:
这里的${deviceName}请替换为之前在腾讯云物联网开发平台新建的设备名称。
4. 点击配置上位机的设置并保存所有参数按钮,完成配置。
5. 设置完成后,DTU的LINK1黄灯常亮且已经成功连接到腾讯云物联网开发平台,可以在控制台查看设备的在线状态。
6. 通过配置上位机发送数据测试。
7. 腾讯云物联网开发平台收到 DTU 的上行数据。
8. 控制台的上行数据是base64编码后展示的,如需要源数据则需要base64解码后查看。
YWJjZDEyMzQ1Njc4OTA= base64 decode ---> abcd1234567890
温湿度传感器通过DTU接入平台
控制台创建温湿度传感器产品
1. 和上面的步骤一样,不过这次我们在当前项目下,创建一个Modbus温湿度传感器的产品,产品的物模型如下,主要是创建了一个温度属性,一个湿度属性。
{"version": "1.0","properties": [{"id": "lac","name": "地区区域码","desc": "地区区域码","required": true,"mode": "r","define": {"type": "int","unit": "","step": "1","min": "0","max": "32","start": "0"}},{"id": "cid","name": "基站码","desc": "基站码","required": true,"mode": "r","define": {"type": "int","unit": "","step": "1","min": "0","max": "32","start": "0"}},{"id": "temperature","name": "温度","desc": "","mode": "rw","define": {"type": "float","min": "0","max": "100","start": "0","step": "1","unit": "℃"},"required": false},{"id": "humidity","name": "湿度","desc": "","mode": "rw","define": {"type": "float","min": "0","max": "100","start": "0","step": "1","unit": "%"},"required": false}],"events": [],"actions": [],"profile": {"ProductId": "J6XJ01DT63","CategoryId": "1"}}
2. 同样新建一个设备,拿到设备的MQTT连接参数。
3. 重新配置DTU的MQTT参数,让新建这台设备上线。
注意:
通过上位机配置DTU的MQTT连接参数时,订阅和发布的topic也需要同步更改为新设备的。
温湿度传感器的配置
1. 首先通过USB转RS485用PC的串口助手来调试温湿度传感器,请求温湿度和响应都正常后,再接入DTU。以本次使用的ZTS-3008-WS-N01型温湿度传感器为例。首先查阅其规格书,默认通讯波特率是4800,需要更改为115200来适配DTU,根据规格书更改波特率的指令直接修改。
注意:
这里修改波特率前使用的还是其默认波特率4800,发送完该指令且温湿度传感器应答完成后,再切换串口助手的波特率为115200。
2. 查询温湿度传感数据
根据其规格书描述发送查询指令来查询。
串口助手可以正确返回温湿度:
这样我们确认温湿度传感器工作正常,然后接入DTU。
温湿度数据上报云平台
通过前面的两个步骤,我们的准备工作完成,现在可以通过控制台来查询温湿度传感器的数据。整个查询上报的流程如下所示:
硬件接线图如下图所示:
由于温湿度传感器和DTU是Modbus通讯,DTU上报给腾讯云物联网开发平台的数据也是Modbus的hex数据,所以,需要将这些数据转换成平台识别的物模型数据,这样我们也能更直观的观测数据,也方便后台的进一步处理和前端的展示。这里就需要用到我们的云端数据解析功能。
1. 开启云端数据解析功能。
2. 编写云端数据解析函数,解析上下行数据。
// 数据完整性检查function checkCrc16(buffer) {let crc = 0xFFFF;let odd;for (let i = 0; i < buffer.length - 2; i++) {crc ^= buffer[i];for (let j = 0; j < 8; j++) {odd = crc & 0x0001;crc >>= 1;if (odd) {crc ^= 0xA001;}}}return (buffer[buffer.length - 1] << 8 | buffer[buffer.length - 2]) == crc;}// 上行数据解析函数,fPort为LoraWAN的端口号,这里可以不用关注。bytes:raw topic上报的裸数据function RawToProtocol(fPort, bytes) {console.log(bytes);// 1. check crc16if (!checkCrc16(bytes)) {return {};}// 2. check is temp&RHif (bytes[0] != 0x01 || bytes[1] != 0x03) {return {};}// 3. 构造数据模板的report消息let data = {"method": "report","clientToken": new Date().getTime().toString(),"params": {}};// 4. 解析温湿度数据data.params.temperature = (bytes[5] << 8 | bytes[6]) / 10.0;data.params.humidity = (bytes[3] << 8 | bytes[4]) / 10.0;// 5. 返回构造好的数据到云平台return data;}
3. 调试上行解析函数:将上面的上行解析函数粘贴到上行解析函数框中,然后填入一条测试上行数据,点击运行。如果解析函数编写正确,则右侧运行结果框中会打印正确的report数据模板消息。
4. 让DTU定时上报温湿度,如果您的DTU有边缘计算和二次开发能力,则编写一个定时任务,定期给温湿度传感器发送轮询温湿度的指令,然后将传感器的上报数据发送到腾讯云物联网开发平台。本文使用的USR-G771并没有提供二次开发能力,但是它有一个心跳功能我们可以加以利用,达到一样的定期上报功能。
4.1 首先通过DTU配置上位机,打开DTU的心跳功能,然后心跳发送方式选择向串口终端发送心跳包。类型选择自定义,数据就是轮询温湿度传感器的数据。勾选为hex数据。配置完成后点击设置并保存所有参数。
4.2 重新通过上位机将DTU配置为MQTT模式,然后点击设置并保存所有参数。
注意:
有人DTU的心跳包只能在网络透传模式里配置,所以需要先配置为网络透传模式,配置好心跳包后,再切换为MQTT模式。
5. 通过以上步骤,就可以定期将温湿度数据上报到腾讯云物联网开发平台了。
步进电机通过DTU接入平台
控制台创建步进电机产品
然后导入如下物模型:
{"version": "1.0","properties": [{"id": "lac","name": "地区区域码","desc": "地区区域码","required": true,"mode": "r","define": {"type": "int","unit": "","step": "1","min": "0","max": "32","start": "0"}},{"id": "cid","name": "基站码","desc": "基站码","required": true,"mode": "r","define": {"type": "int","unit": "","step": "1","min": "0","max": "32","start": "0"}},{"id": "dir","name": "电机运动方向","desc": "","mode": "rw","define": {"type": "enum","mapping": {"0": "CW","1": "CCW"}},"required": false},{"id": "a","name": "加速度","desc": "范围0 - 255,0为直接启动,1 - 255设置曲线加减速的快慢","mode": "rw","define": {"type": "int","min": "0","max": "255","start": "0","step": "1","unit": ""},"required": false},{"id": "speed","name": "转速","desc": "","mode": "rw","define": {"type": "int","min": "0","max": "3000","start": "0","step": "1","unit": "rpm"},"required": false}],"events": [],"actions": [],"profile": {"ProductId": "JPEKX9WWY4","CategoryId": "1"}}
注意:
步进电机有很多参数需要配置,这里只是取有代表性的三个属性来做示例,具体请根据不同应用来做相应调整。
步进电机配置
1. 电机初次上电需要校准,校准时电机不要带负载。
2. 电机使用Modbus RTU协议,默认通讯115200,8N1,请在电机控制菜单中选择Checksum为Modbus。
3. 使用USB转RS485模块发送读取固件版本和硬件版本的指令,如果接线和供电都正常,则会收到相应的回复。
云平台控制步进电机
通过上面的步骤,电机已经可以通过USB转485成功控制,将电机接入DTU,硬件连接如下:
1. 通过腾讯云物联网开发平台控制台创建电机设备。
2. 打开云端解析功能。
3. 将步骤1新建的设备的MQTT连接参数通过DTU配置工具填入DTU,使得这台设备成功上线。
4. 编写下行数据解析函数,调试通过后提交。
// 生成CRC16校验码function createCrc16(buffer) {let crc = 0xFFFF;let odd;for (let i = 0; i < buffer.length - 2; i++) {crc ^= buffer[i];for (let j = 0; j < 8; j++) {odd = crc & 0x0001;crc >>= 1;if (odd) {crc ^= 0xA001;}}}buffer[buffer.length - 2] = crc & 0xff;buffer[buffer.length - 1] = crc >> 8;return buffer;}// 下行测试数据,用于调试const testControl= {"method": "control","clientToken": "20a4ccfd-d308-11e9-86c6-5254008a4f10","params": { "speed": 1, "a": 3, "dir": 0 }}// 下行数据解析函数function ProtocolToRaw(obj) {// 通过DTU发送的电机控制数据let sendBytes = [0x01, 0x10, 0x00, 0xf6, 0x00, 0x03, 0x06, 0x00, 0x11, 0x00, 0x88, 0x00, 0x00, 0x7f, 0x75];if (obj.method == "control") {sendBytes[7] = obj.params.dir; // 电机方向sendBytes[8] = obj.params.a; // 加速度sendBytes[9] = (obj.params.speed >> 8) & 0xff; // 速度sendBytes[10] = obj.params.speed & 0xff;createCrc16(sendBytes) // 生成CRC16校验数据}return sendBytes;}
5. 编写上行数据解析函数,调试通过后提交。
// 校验crc16是否正确function checkCrc16(buffer) {let crc = 0xFFFF;let odd;for (let i = 0; i < buffer.length - 2; i++) {crc ^= buffer[i];for (let j = 0; j < 8; j++) {odd = crc & 0x0001;crc >>= 1;if (odd) {crc ^= 0xA001;}}}return (buffer[buffer.length - 1] << 8 | buffer[buffer.length - 2]) == crc;}// 测试数据const testBytes = [1, 16, 0, 246, 0, 3, 96, 58];// 上行数据解析function RawToProtocol(fPort, bytes) {console.log(bytes);// 1. check crc16if (!checkCrc16(bytes)) {console.log("crc16 error");return {};}// 2. 这里只是对速度控制的上行数据做解析,如果有其他的上行数据 都可以在这里处理,如电机主动上报的一些数据,可以用report来解析上报if (bytes[0] != 0x01 || bytes[1] != 0x10) {return {};}let data = {"method": "control_reply", // 这里只是解析了速度控制的上行数据,构造了一条物模型数据"clientToken": new Date().getTime().toString(),"code": 0,"status": "success",};console.log(data)return data;}
6. 上下行数据解析函数编写完成后,就可以通过在线调试来控制电机。
每一条控制指令下行后,电机执行完成都会返回一条上行指令,通过上行解析函数后的日志如下:
Q&A
1. 我使用的DTU无法定时发送Modbus轮询指令,该怎么操作?
答:可以使用云端解析脚本的下行解析函数,由云端来发送一个轮询的物模型协议指令,然后解析成Modbus协议的轮询指令下发给DTU,再由DTU发送给温湿度传感器,但是这样就不能做到定时上报了。
2. 我的DTU无法获取传感器数据
答:1. 先使用USB转RS485串口工具接传感器,模拟DTU来发送轮询指令,看传感器是否正常上报;如异常:
a. 检查硬件连接是否正常;
b. 根据传感器规格书检查串口波特率是否匹配(包括和DTU的串口波特率是否匹配)
2 .再使用USB转RS485串口工具接DTU,看是否正确收到DTU的轮询指令
3. DTU数据正常上报,但是无法解析出正确的物模型数据
答:1. 首先在腾讯云物联网开发平台控制台查询上报的裸数据是否正确。
2 . 检查解析函数是否编写正确,可以将上面的裸数据填入模拟调试框中,来调试上行解析函数。