银尔达IOT物联网开发平台:iot.yinerda.com
更多资料访问:https://yinerda.yuque.com/yt1fh6/iot
功能支持4G设备的连接,管理;支持设备数据点定义,解析,处理,储存,统计;支持微信小程序/APP管理对接;通过电话、短信、微信、邮件等报警信息通知;支持服务与服务器对接;支持服务器边缘计算数据;支持私有化部署,log替换,特殊功能定制。
注意:任务可以自己写,也可以提需求找工程师实现,如果涉及到多个传感器等复杂应用,建议我们工程师给你实现,快速,稳定,靠谱。
一、功能介绍
本教程任务实现银尔达RTU,1路开关控制,1路输入检查功能。支持的产品型号:
| 型号 | 功能 |
| RW2882 | 8路10A继电器,8路光耦干接点输入,2路RS485,1路RS232,2路0-20ma模拟量,1路本地RTC时钟 |
| A108 | 8路GPIO输出,8路GPIO输入,1路串口2路ADC,金手指核心板焊接 |
注意输入输出的还可以自己内部实现联动,比如输入触发后,控制继电器输出等,这部分逻辑可以自己实现,比较简单,也可以找工程师实现。
注意拥有串口的设备,还可以扩展各种传感器,比如读取温湿度,液位,电表,功率等数据上传监控,并且可以和继电器,输入等实现联动控制,这部分特殊逻辑比较复杂,如果有需要可以提需求让工程师给你对接传感器功能。
二、显示的UI效果
2.1、小程序界面


2.2、WEB界面


三、任务代码
产品创建,DTU参数配置参考《平台入门实例(必看)》教程,里面讲解了完整的产品创建,数据点定义,设备授权,设备配置,参数更新等流程。然后在把本教程创建产品的时候使用模板“ 八路远程开关 ”创建,已经设置了数据点和UI,然后把下面的任务拷贝到DTU的分组任务里面,上电更新参数即可,不需要在额外操作。
function
local tname="SW8"
log.info(tname,"start")
local nid=1
local uid=1
PronetStopProRecCh(1)
UartStopProRecCh(1)
--IOT系统保留字段
local pver,fver,rssi,pele="SW8","DTU4_2.0.0",50,50
--自定义字段
local sw1,sw2,sw3,sw4=PerGetDoSta(1),PerGetDoSta(2),PerGetDoSta(3),PerGetDoSta(4)
local sw5,sw6,sw7,sw8 = PerGetDoSta(5),PerGetDoSta(6),PerGetDoSta(7),PerGetDoSta(8)
local in1,in2,in3,in4 = PerGetDiById(1),PerGetDiById(2),PerGetDiById(3),PerGetDiById(4)
local in5,in6,in7,in8 = PerGetDiById(5),PerGetDiById(6),PerGetDiById(7),PerGetDiById(8)
local vin,aii1,aii2=0,0,0
--做一些业务逻辑的变量
local oin1,oin2,oin3,oin4,oin5,oin6,oin7,oin8=nil,nil,nil,nil,nil,nil,nil,nil --输入的老状态
local lasttime =os.time()
local needdup =1
local sdid =1
--查询table 数组里面是否有某个变量
function CheckNameInTable(t,value)
for i, v in ipairs(t) do
if v == value then
return true
end
end
return false
end
--通过CSQ获取信号强度的函数
function TaskGetRssi()
local csq = mobile.csq()
local r =0
if csq > 29 then
r = 100
elseif csq > 25 then
r = 90
elseif csq > 22 then
r = 80
elseif csq > 20 then
r = 70
elseif csq > 18 then
r = 60
elseif csq > 16 then
r = 50
elseif csq > 14 then
r = 40
else
r = 0
end
return r
end
--解析服务器
while true do
--接收服务器下发的数据
local netr = PronetGetRecChAndDel(nid)
if netr then
log.info(tname,"netr data",netr)
--解析IOT模型数据服务器下发的是JSON
local obj,r =json.decode(netr)
if r and obj and obj.cmd and obj.did then --判断关键字段是否缺失,然后根据自己定义的数据点去解析字段做逻辑
if obj.cmd =="sset" then --服务器设置参数
local p = obj.param --把param的值取出来存起来后面做逻辑,也可以一再这里做逻辑,最好不要做延迟动作的逻辑,否则和阻塞系统
if p.sw1 then
sw1 = p.sw1
PerSetDo(1,sw1)--这个参数是0和1,如果是0-1可以直接用,如果是true /false 还需要转换后才能用
end
if p.sw2 then
sw2 = p.sw2
PerSetDo(2,sw2)
end
if p.sw3 then
sw3 = p.sw3
PerSetDo(3,sw3)
end
if p.sw4 then
sw4 = p.sw4
PerSetDo(4,sw4)
end
if p.sw5 then
sw5 = p.sw5
PerSetDo(5,sw5)
end
if p.sw6 then
sw6 = p.sw6
PerSetDo(6,sw6)
end
if p.sw7 then
sw7 = p.sw7
PerSetDo(7,sw7)
end
if p.sw8 then
sw8 = p.sw8
PerSetDo(8,sw8)
end
--应答服务器
local b={}
b.cmd="ssetbck"
b.did=obj.did --注意这个did需要和服务器下发的did一样,表示应答对应的命令
b.rst=0
b.times =os.time().."000" --转换成ms
local s = json.encode(b)
log.info(tname,"ssetbck data",s)
PronetSetSendCh(nid,s) --发给服务器应答数据
lasttime = os.time()
elseif obj.cmd =="sget" then--服务器读取一个或者多参数
local p=obj.param.datapoint
local b={} --b是组装应答的结构体
b.cmd ="sgetbck"
b.did =obj.did
b.rst =0
b.times =os.time().."000" --转换成ms
b.param={}
-- param.xxx xxx就是服务器获取的字段,当然如果流量足够,可以直接返回设备全部的状态给服务器
if CheckNameInTable(p,"imei") then
b.param.imei=mobile.imei()
end
if CheckNameInTable(p,"iccid") then
b.param.iccid=mobile.iccid()
end
if CheckNameInTable(p,"imsi") then
b.param.imsi=mobile.imsi()
end
if CheckNameInTable(p,"pver") then
b.param.pver=pver
end
if CheckNameInTable(p,"fver") then
b.param.fver=fver
end
b.param.rssi=TaskGetRssi() --注意rssi是百分比表示
b.param.pele=100 --注意pele是百分比表示
--业务字段
b.param.sw1=PerGetDoSta(1)
b.param.sw2=PerGetDoSta(2)
b.param.sw3=PerGetDoSta(3)
b.param.sw4=PerGetDoSta(4)
b.param.sw5=PerGetDoSta(5)
b.param.sw6=PerGetDoSta(6)
b.param.sw7=PerGetDoSta(7)
b.param.sw8=PerGetDoSta(8)
b.param.in1 =PerGetDiById(1)
b.param.in2 =PerGetDiById(2)
b.param.in3 =PerGetDiById(3)
b.param.in4 =PerGetDiById(4)
b.param.in5 =PerGetDiById(5)
b.param.in6 =PerGetDiById(6)
b.param.in7 =PerGetDiById(7)
b.param.in8 =PerGetDiById(8)
b.param.vin =PerGetAdcGatherValByAdcId(2)
b.param.aii1=PerGetAdcGatherValByAdcId(1)
b.param.aii2=PerGetAdcGatherValByAdcId(0)
local s = json.encode(b)
log.info(tname,"sgetbck data",s)
PronetSetSendCh(nid,s) --发给服务器应答数据
lasttime = os.time()
elseif obj.cmd =="dgetbck" then --服务器应答设备获取参数的命令,可以处理也可以不出来,应答表示服务器收到了,没应答你可以重发
elseif obj.cmd =="dupbck" then --服务器应答设备上报参数的命令
end
end
end
--主动上报数据,一般是检查状态变化后或者周期上报,IOT 要求5分钟内必须上报数据要不然会提示离线
in1 =PerGetDiById(1)
in2 =PerGetDiById(2)
in3 =PerGetDiById(3)
in4 =PerGetDiById(4)
in5 =PerGetDiById(5)
in6 =PerGetDiById(6)
in7 =PerGetDiById(7)
in8 =PerGetDiById(8)
if in1 ~= oin1 or in2~= oin2 or in3~= oin3 or in4~= oin4 or in5 ~= oin5 or in6~= oin6 or in7~= oin7 or in8~= oin8 then
oin1 = in1
oin2 = in2
oin3 = in3
oin4 = in4
oin5 = in5
oin6 = in6
oin7 = in7
oin8 = in8
needdup =1
log.info(tname,"in up")
end
if os.time() -lasttime > 180 then --没任何数据交互180秒上报一次
lasttime = os.time()
needdup =1
log.info(tname,"heart up")
end
if needdup ==1 and 1==PronetGetNetSta(nid) then
local b={} --b是组装应答的结构体
b.cmd ="dup"
b.did =sdid..""
b.times =os.time().."000" --转换成ms
b.param={}
b.param.rssi=TaskGetRssi() --注意rssi是百分比表示
b.param.pele=100 --注意pele是百分比表示
b.param.sw1=PerGetDoSta(1)
b.param.sw2=PerGetDoSta(2)
b.param.sw3=PerGetDoSta(3)
b.param.sw4=PerGetDoSta(4)
b.param.sw5=PerGetDoSta(5)
b.param.sw6=PerGetDoSta(6)
b.param.sw7=PerGetDoSta(7)
b.param.sw8=PerGetDoSta(8)
b.param.in1 =PerGetDiById(1)
b.param.in2 =PerGetDiById(2)
b.param.in3 =PerGetDiById(3)
b.param.in4 =PerGetDiById(4)
b.param.in5 =PerGetDiById(5)
b.param.in6 =PerGetDiById(6)
b.param.in7 =PerGetDiById(7)
b.param.in8 =PerGetDiById(8)
b.param.vin =PerGetAdcGatherValByAdcId(2)
b.param.aii1=PerGetAdcGatherValByAdcId(1)
b.param.aii2=PerGetAdcGatherValByAdcId(0)
b.param.rtc=UserRtcGetTime()
local s = json.encode(b)
log.info(tname,"dup data",s)
PronetSetSendCh(nid,s) --发给上报发给服务器
needdup =0
sdid =sdid+1 --每次发送后did要与上一次不一样
lasttime = os.time()
end
sys.wait(100)
end
end
5万+

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



