银尔达 DTU 接入 ThingsCloud
银尔达 DTU 接入 ThingsCloud
这个示例我们使用银尔达 DTU 的 MQTT 网络通信协议来接入 ThingsCloud。
ThingsCloud 是开放协议的物联网平台,在 ThingsCloud 控制台可以统一接入不同厂商不同种类的智能硬件设备,并对它们进行连接管理、数据采集、实时控制、智能联动,并内置丰富的可视化看板和 SaaS、App 等应用,以及开放 HTTP API,支持任何第三方应用集成。
ThingsCloud 控制台的配置方法对不同设备基本相同,因此本示例中我们重点介绍 DTU 上位机软件的配置方法,供您参考。
使用 MQTT 方式接入 ThingsCloud
ThingsCloud 控制台设置
在配置 DTU 上位机软件之前,我们先进入 ThingsCloud 控制台,完成准备工作,包括:
- 创建设备类型,以及自定义数据流。
- 创建设备,获得设备专属的 MQTT 地址及连接信息。
具体的步骤非常简单,5分钟即可完成,详情浏览 DTU MQTT 接入。
配置 DTU 网络连接
银尔达 DTU 支持基于 Web 的远程配置,进入配置后台,在分组参数设置页面,在网络通道参数中,我们开启通道1,配置以下信息:
- 服务器地址:复制设备的 MQTT 地址,是域名格式,注意不要带
mqtt://
前缀。 - 服务器端口:1883
- 登录客户端ID:可不填
- 登录用户名:复制设备证书的
AccessToken
- 登录密码:复制设备证书的
ProjectKey

接下来配置 MQTT 主题,如下:
- 订阅消息主题:
data/stream/set
- 发布消息主题:
data/stream
请注意,以上的两个主题是前边我们创建设备类型下的自定义数据流时,默认生成的主题,如果您使用了其它标识符,按实际填写。

确认写入配置到 DTU 后,配置生效,控制台的 DTU 设备显示已在线。
使用内置方式接入 ThingsCloud
对于部分银尔达 DTU 型号,支持内置方式接入 ThingsCloud,同时支持一型一密,也就是可以自动创建设备。

详细步骤请浏览教程 (Air780)ThingsCloud配置测试实例
配置 RS485/Modbus 设备的透传云解析
当 DTU 成功连接 ThingsCloud 后,我们就可以在 DTU 上连接任意的 RS485/Modbus 设备,那么接下来如何在云平台上解析 Modbus 消息?以及如何从云平台下发 Modbus 消息到设备用于实时控制?
请浏览 RS485/Modbus 设备通过 DTU 透传接入 ThingsCloud。
控制 RTU 内置继电器
部分银尔达的 RTU 设备内置继电器,可通过银尔达 DTU 配置平台的任务功能,编写 LUA 脚本语言来解析服务器下发的控制指令,控制继电器的开关。
请参考银尔达提供的教程 服务器命令和本地输入控制继电器,该任务可用于内置两路继电器和两路 DI 的 RTU 设备。
在此基础上,我们对任务代码略作修改,即可在 ThingsCloud 平台直接使用开关量属性来控制继电器开关,以便充分利用平台的开关量特性,例如快速实现多控、定时开关、延迟开关等功能。



以下为修改后的任务代码,仅高亮的部分做了修改。
function
local taskname="userDataTask"
log.info(taskname,"start")
local nid,netr,nets=1,"",""
local uid,uartr,uarts=1,"",""
local oldkey =nil
local in1os,in2os,in3os,in4os=nil,nil,nil,nil
local needup=1
local lastuptime=0
PronetStopProRecCh(1)
UartStopProRecCh(1) --如果串口数据还需要透传,需要删除
PerSetDo(1,0)
PerSetDo(2,0)
while true do
--解析网络数据
netr = PronetGetRecChAndDel(nid)
if netr then
log.info(taskname,"netr data",netr)
local j =json.decode(netr)
if j and type(j)=="table" and (j.relay1 ~= nil or j.relay2 ~= nil) then
if j.relay1 == true then
PerSetDo(1,1)
elseif j.relay1 == false then
PerSetDo(1,0)
end
if j.relay2 == true then
PerSetDo(2,1)
elseif j.relay2 == false then
PerSetDo(2,0)
end
local jb={}
jb.cmd ="cmdbck"
jb.res =1
jb.In1=PerGetDiById(1)
jb.In2=PerGetDiById(2)
jb.csq=mobile.csq()
local bck = json.encode(jb)
if bck and 1==PronetGetNetSta(nid) then
PronetSetSendCh(nid,bck)
end
end
end
--检查输入通道1是否变化控制继电器
local key=PerGetDiById(1)
if oldkey~=key then
oldkey=key
if key==0 then
local s = PerGetDoSta(1)
if s ==0 then
PerSetDo(1,1)
else
PerSetDo(1,0)
end
end
end
--周期上报设备状态
local nowtime = os.time()
if nowtime-lastuptime > 60 then
lastuptime = nowtime
needup=1
end
--检查输入状态变化马上上报
local d ={}
local in1s=PerGetDiById(1)
local in2s =PerGetDiById(2)
d.datetime=os.date("%Y-%m-%d %H:%M:%S")
d.csq=mobile.csq()
d.imei=mobile.imei()
d.iccid = PerGetIccid()
d.vbat = PerGetVbattV()
d.In1 = in1s
d.In2 = in2s
if in1s~=in1os then
in1os =in1s
needup=1
end
if in2s~=in2os then
in2os =in2s
needup=1
end
if needup ==1 then
local updata = json.encode(d)
netsta = PronetGetNetSta(nid)
log.info(taskname,"updata",updata,"netsta",netsta)
if updata and netsta ==1 then
PronetSetSendCh(nid,updata)
end
needup=0
end
sys.wait(100)
end
end
以上任务不仅实现了接收平台的开关量属性下发,还实现了对 DI 输入状态的变化上报。
解析设备上报的 GPS 位置信息
对于部分支持 GPS 定位的 DTU 设备,请参考教程 银尔达 Air780EG 模块上报 GPS/LBS 位置数据解析。