设备通过DTU接入平台

最近更新时间:2024-01-30 11:44:11

我的收藏

场景简介

在工业、农业、商业、园区、楼宇存在着大量通过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 点击更多->编辑->关闭数据透传功能。




创建产品与设备

如果还没有开通腾讯云物联网开发平台,请先了解并开通腾讯云物联网开发平台
2. 点击公共实例->新建项目->存。



3. 点击进入上一步新建的项目,点击新建产品,进入新建产品界面。



注意:
这里的数据协议需要选择自定义透传。
4. 点击设备调试-->新建设备,设备名称可以自定义,这里建议使用当前DTU的IMEI作为设备名,方便后期对设备管理。



5. 至此,我们拿到了设备的三元组信息,可以据此生成MQTT连接参数。



注意:
控制台生成的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
9. 当需要从云端控制使用自定义透传协议上云的设备时,可参考 设备透传指令控制 云 API 直接使用 在线调试 工具进行调试。


温湿度传感器通过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 crc16
if (!checkCrc16(bytes)) {
return {};
}
// 2. check is temp&RH
if (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"
}
}
注意:
步进电机有很多参数需要配置,这里只是取有代表性的三个属性来做示例,具体请根据不同应用来做相应调整。

步进电机配置

笔者手上是一个ZDT-X42_V1.2步进电机,带控制器和Modbus通讯,关于电机的详细资料,请点击这里获取。硬件调试接线方式如下:



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 crc16
if (!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 . 检查解析函数是否编写正确,可以将上面的裸数据填入模拟调试框中,来调试上行解析函数。