【银尔达IOT物联网平台】四路远程开关示例

银尔达IOT物联网开发平台:iot.yinerda.com

更多资料访问:https://yinerda.yuque.com/yt1fh6/iot

功能支持4G设备的连接,管理;支持设备数据点定义,解析,处理,储存,统计;支持微信小程序/APP管理对接;通过电话、短信、微信、邮件等报警信息通知;支持服务与服务器对接;支持服务器边缘计算数据;支持私有化部署,log替换,特殊功能定制。


注意:任务可以自己写,也可以提需求找工程师实现,如果涉及到多个传感器等复杂应用,建议我们工程师给你实现,快速,稳定,靠谱。

一、功能介绍

本教程任务实现银尔达RTU,4路开关控制,4路输入检查功能。支持的产品型号:

型号

功能

SW1004P-30

4路10A继电器,4路光耦干接点输入,1路RS485,1路本地RTC时钟

A104

4路输入,4路输出,1路TTL,2路ADC,双面金手指焊接

A104-A

4路输入,4路输出,1路TTL,单面2.0间距金手指焊接

注意输入输出的还可以自己内部实现联动,比如输入触发后,控制继电器输出等,这部分逻辑可以自己实现,比较简单,也可以找工程师实现。

注意拥有串口的设备,还可以扩展各种传感器,比如读取温湿度,液位,电表,功率等数据上传监控,并且可以和继电器,输入等实现联动控制,这部分特殊逻辑比较复杂,如果有需要可以提需求让工程师给你对接传感器功能。

二、显示的UI效果

2.1、小程序界面

2.2、WEB界面

三、任务代码

产品创建,DTU参数配置参考《平台入门实例(必看)》教程,里面讲解了完整的产品创建,数据点定义,设备授权,设备配置,参数更新等流程。然后在把本教程创建产品的时候使用模板“ 四路远程开关 ”创建,已经设置了数据点和UI,然后把下面的任务拷贝到DTU的分组任务里面,上电更新参数即可,不需要在额外操作。

function
	local tname="SW4"
	log.info(tname,"start")
	local nid=1
	local uid=1
	PronetStopProRecCh(1)
	UartStopProRecCh(1)
	--IOT系统保留字段
	local pver,fver,rssi,pele="SW4","DTU.1.1.21",50,50
	--自定义字段
	local sw1,sw2,sw3,sw4= PerGetDoSta(1),PerGetDoSta(2),PerGetDoSta(3),PerGetDoSta(4)
	local in1,in2,in3,in4 =PerGetDiById(1),PerGetDiById(2),PerGetDiById(3),PerGetDiById(4)
	local vin,aii1,aii2=0,0,0
	--做一些业务逻辑的变量
	local oin1,oin2,oin3,oin4=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 
					--应答服务器
					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就是服务器获取的字段,当然如果流量足够,可以直接返回设备全部的状态给服务器
					b.param.imei=mobile.imei()
					b.param.iccid=mobile.iccid()
					b.param.imsi=mobile.imsi()
					b.param.pver=pver
					b.param.fver=fver

					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.in1 =PerGetDiById(1)
					b.param.in2 =PerGetDiById(2)
					b.param.in3 =PerGetDiById(3)
					b.param.in4 =PerGetDiById(4)
					b.param.vin =12000--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)
		
		if in1 ~= oin1 or in2~= oin2 or in3~= oin3 or in4~= oin4 then 
			oin1 = in1
			oin2 = in2 
			oin3 = in3
			oin4 = in4 
			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.in1 =PerGetDiById(1)
			b.param.in2 =PerGetDiById(2)
			b.param.in3 =PerGetDiById(3)
			b.param.in4=PerGetDiById(4)
			b.param.vin =12000--PerGetAdcGatherValByAdcId(0)
			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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值