目前只有Air780支持,固件版本等于大于V1.1.1。
使用任何平台本质都是MQTT协议协议通讯,这个难点是搞清楚平台的通讯规则,理清楚订阅topic,发布topic和数据格式(物模型)。
DTU目前是解决了平台基本的连接和交互问题,根据教程连接平台后,在实际实现自己的业务上用不起来。这个本质的原因是不清楚平台如何使用,平台需要的topic和物模型数据格式不清楚导致的。所以基本步骤测试完成后就要研究平台的文档和询问平台的技术支持,清楚topic和数据格式后,在继续下一步结合银尔达的技术支持,让DTU按自己业务需求上传和解析数据。
此Demo对于初学者比较困难,而且不可能满足所有客户的需求,只是对一些常见的操作进行编辑,如果需求正好符合可以直接按照示例配置和使用,如果有不同需求,需要自己修改或者找销售定制。
一、实例简介
本实例是通过移动物联网平台自定义物模型和DTU的任务功能来实现以下三个功能,使用的设备要有对应的继电器和输入等硬件。
- 设备服务调用:控制4路继电器开和关,并将继电器状态返回至服务器。
- 设备属性获取:平台下发属性获取,将数据上传至服务器属性。
- 设备事件上报:设备输入通道1状态变化,将设备当前状态上报服务器事件。
二、必要条件
- 如果您是首次使用DTU配置平台,请先参考《WEB配置入门教程》进行操作,包括设备的添加、分组的创建以及设备在分组中的分配。随后,依据本页指南完成云平台的参数设置及建立连接。
- 设备接上天线,插上卡,正常10W电源供电,NET LED 500ms或者1000ms闪烁一次,表示网络正常。
- 要使用物模型控制设备实现各种功能首先必须要连接移动平台物模型,了解物模型是什么以及物模型的协议,
如果对物模型不了解,是很难使用起来的,移动平台物模型详细介绍点击下方链接查看。
https://open.iot.10086.cn/doc/v5/fuse/detail/899
三、图文教程-创建产品
先点进链接进入平台,整体流程是创建产品,配置参数,更新参数,使用任务处理topic。
(一) 创建产品

根据需求选择,这里选择产品品类为"其他行业",选择智能化方式为“设备接入”。


写信息,选择直连设备,MQTT协议,OneJson,蜂窝,自定义方案。

(二) 获取产品ID和access_key
进入产品开发,获取 产品ID 和access_key参数,这2个参数到时需要配置到DTU参数里面。


(三) 创建物模型
可以使用标准的物模型产品,也可以自己定义数据点,这里我们自定义三个物模型。
1. 定义一个属性类型,temperature ,浮点数据,范围-100~200。

2. 定义一个服务类型,out,里面输入参数继电器1,继电器2,继电器3,继电器4,relay1-4





在输出参数里面,添加继电器1状态,继电器2状态,继电器3状态,继电器4状态,relay_sta1-4




3. 定义一个事件类型,输入变化上报,input,告警

在输出参数里面,添加输入1

4. 最终的物模型界面如图,点击保存生效。

(四) topic介绍说明
https://open.iot.10086.cn/console/product/qSiGu204Ft/device/index
物模型topic数量很多,我们这里需要订阅三个topic,分别是:平台获取直连设备属性、平台调用直连设备服务、直连设备上报事件响应。


topic中{device-name} 是一个占位符,要替代实际的设备ID。都建议使用IMEI,在配置时用${IMEI}替换掉{device-name},平台会自动提供IMEI号,方便管理和处理。例:
$sys/K03lYKYzhx/{device-name}/thing/property/get 原始topic
$sys/K03lYKYzhx/${IMEI}/thing/property/get 使用${IMEI}替换{device-name}。
$sys/K03lYKYzhx/${IMEI}/thing/service/{identifier}/invoke 其中{identifier}换成实际的服务调用物模型标识符,比如out。

(五) 自动注册
自动注册设备,开启自动注册个功能,设备使用IMEI编号自动注册,方便管理设备。不开启自动注册,也建议设备使用IMEI作为设备名字,方便后续管理。

四、图文教程-配置参数
(一) 任务代码
此代码实例可以实现,控制四路继电器远程开关,并将继电器状态回复至平台,输入通道1变化时通报平台告警事件信息,平台主动获取设备属性。通过调用API将topic拼接到数据前,再通过判断topic来确认是需要做什么处理,并根据平台需要的格式组装数据然后使用对应的物模型topic推送给平台。
任务里自己对应需要的发布topic,例如平台调用直连设备服务响应topic为
"$sys/"..pid.."/"..imei.."/thing/service/"..identifier.."/invoke_reply"
其中pid为产品ID,imei为设备imei,identifier为服务调用标识符,后续需要修改为自己实际的产品ID和标识符。
function
local taskname="userTask"
log.info(taskname,"start")
local nid=1 --网络通道ID
local uid=1 --串口通道ID
local needid=1 --事件上报ID
local oldin1=nil --输入状态初始化
local imei=mobile.imei() --设备IMEI
local pid="qSiGu204Ft" --产品pid
local identifier="out" --服务调用标识符
local Atdata=120 --属性获取响应数据 可以固定 或者在循环里用串口获取再上报
PronetStopProRecCh(1)
PronetMqttProReciveTopic(nid,1,",") --将topic 拼接到数据前 以,分隔
while true do
local netr = PronetGetRecChAndDel(nid) --获取网络缓存
if netr then
log.info(taskname,"netr",netr)
local a1 ,a2 = string.find(netr,",") --处理数据和topic
if a1 and a1~=1 and a2 then
local topic = string.sub(netr,1,a1-1) --截取topic
local netdata = string.sub(netr,a1+1,-1) --截取数据
local d = json.decode(netdata)
if d and type(d)=="table" then --处理数据 根据topic判断物模型类型
if topic == "$sys/"..pid.."/"..imei.."/thing/service/"..identifier.."/invoke" then --服务调用topic
if d.id and d.version and d.params then
if d.params.relay1 == true then
PerSetDo(1,1)
elseif d.params.relay1 == false then
PerSetDo(1,0)
end
if d.params.relay2 == true then
PerSetDo(2,1)
elseif d.params.relay2 == false then --服务调用控制继电器1-4
PerSetDo(2,0)
end
if d.params.relay3 == true then
PerSetDo(3,1)
elseif d.params.relay3 == false then
PerSetDo(3,0)
end
if d.params.relay4 == true then
PerSetDo(4,1)
elseif d.params.relay4 == false then
PerSetDo(4,0)
end
local j={}
j.id=d.id
j.code=200
j.msg="succ"
j.data={}
j.data["relay_sta1"]=PerGetDoSta(1)== 1 and true or false --获取继电器1状态 继电器开上报 true 否则 上报false
j.data["relay_sta2"]=PerGetDoSta(2)== 1 and true or false
j.data["relay_sta3"]=PerGetDoSta(3)== 1 and true or false
j.data["relay_sta4"]=PerGetDoSta(4)== 1 and true or false
local jt=json.encode(j)
if PronetGetNetSta(nid)==1 and jt then
local s={}
s[1]="$sys/"..pid.."/"..imei.."/thing/service/"..identifier.."/invoke_reply" --服务调用响应topic
s[2]=jt
PronetSetSendCh(nid,s)
end
end
elseif topic == "$sys/"..pid.."/"..imei.."/thing/property/get" then --属性获取topic
if d.id and d.version and d.params then
if d.params[1]=="temperature" then --判断属性获取标识符
--这里使用的固定数据上报,如果要读取串口设备的数据,要自己对串口进行调用,对串口数据做解析,最后再组装json上报,demo不过多赘述
local t = {}
t.id=d.id
t.code=200
t.msg="succ"
t.data={}
t.data.temperature=Atdata
local jt=json.encode(t)
if PronetGetNetSta(nid)==1 and jt then
local s={}
s[1]="$sys/"..pid.."/"..imei.."/thing/property/get_reply" --属性获取响应topic
s[2]=jt
PronetSetSendCh(nid,s)
end
end
end
end
end
end
end
in1=PerGetDiById(1) --输入1变化上报事件
if in1~=oldin1 then
oldin1 =in1
local p={}
p.id=tostring(needid)
p.version="1.0"
p.params={}
p.params.input={}
p.params.input.value={}
p.params.input.value.in1=in1 == 1 and true or false --状态变化为触发状态上报false 正常状态上报true
local jt=json.encode(p)
if PronetGetNetSta(nid)==1 and jt then
local s={}
s[1]="$sys/"..pid.."/"..imei.."/thing/event/post" --事件主动上报topic
s[2]=jt
PronetSetSendCh(nid,s)
end
needid=needid+1 --每次触发事件后 id加1
end
sys.wait(100)
end
end
(二) 根据产品配置参数
1. 网络通道参数填写
将创建好的产品的产品ID 和access_key填入WEB平台,订阅topic填入之前介绍的三个topic,多topic之间用英文的分号(;)分开,物模型发布topic我们需要在任务里定义,但是平台上必须填写一个任意的topic,否则无法推送数据到服务器,topic自己随意填一个即可,比如aaa。

2. 任务参数
将任务启动并将上面的任务代码复制到文本框中,放入的时候可以去掉注释,并确保function前无空格,代码最后的end后无空格,否则代码不生效或会出错。

(三) 更新参数
配置完参数后,点击保存参数,断电重启设备,等待设备更新参数。
如果你只有一台设备,可以在分组里面,观察未更新设备数量,如果是0表示更新。

如果有多台设备,可以在设备列表里面查看,当“分组参数版本” 等于“设备参数版本”,表示参数更新了。

4.3、观察服务器连接情况
如果参数正确,移动平台会使用IMEI自动创建设备,并且自动激活。可以在设备接入管理,设备管理里面查询。

(四) 物模型使用示例
设备列表,进入详情,进入设备调试,引用模拟器,可以设置属性,获取属性,服务调用。启动任务后,DTU会自动应答平台发送的数据。

1. 平台服务调用控制继电器
这里我们控制四路继电器同时打开,平台收到了DTU的正确响应,说明服务调用执行成功。

2. 平台属性获取
这里我们下发属性获取,平台收到了DTU的正确响应,属性改变,说明属性获取成功。


3. 设备事件上报
输入变化后,DTU会主动上报事件。

1319

被折叠的 条评论
为什么被折叠?



