Air202学习 四 (模块mqtt通信控制继电器)

1. 板子air202控制继电器原理图:

 

2. air202模块设置连接mqtt服务器通信

操作步骤:

(1)  air202模块创建mqtt客户端

(2) 获取设备IMEI检测分配的ip(设备是否连接上网络)

(3) 订阅主题 / 发布主题

(4) 处理断线重连问题

(5) 处理接收的数据

require"misc"
require"mqtt"
require"pins"
require"common"
module(...,package.seeall)
------------继电器引脚---------------------------
RelayPin1 = pio.P0_4  --定义继电器引脚
RelayPin2 = pio.P0_5
RelayPin3 = pio.P0_6
RelayPin4 = pio.P0_7

pio.pin.setdir(pio.OUTPUT,RelayPin1)	--配置gpio方向 输出方式
pio.pin.setdir(pio.OUTPUT,RelayPin2)	--配置gpio方向 输出方式
pio.pin.setdir(pio.OUTPUT,RelayPin3)	--配置gpio方向 输出方式
pio.pin.setdir(pio.OUTPUT,RelayPin4)	--配置gpio方向 输出方式

pio.pin.setval(0,RelayPin1)				--输出gpio电平
pio.pin.setval(0,RelayPin2)				--输出gpio电平
pio.pin.setval(0,RelayPin3)				--输出gpio电平
pio.pin.setval(0,RelayPin4)				--输出gpio电平

------------定义变量区--------------------------  lbsmqtt.airm2m.com   1884
local PROT,ADDR,PORT = "TCP","47.93.19.134",1883  --连接mqtt服务器信息 
local MqttUserName = "yang"
local MqttUserPassword = "11223344"
local MqttSubToptic = "222"	--订阅主题
local MqttPubToptic = "111"	--发布主题
local UartRecedata = ""			
local UartReceDataCnt = 0		

---------串口1接收函数注册----------------------
uart.setup(1,115200,8,uart.PAR_NONE,uart.STOP_1)--设置串口1的 波特率 数据位 校验位 停止位
local function UartRead()
	data = uart.read(1,"*l")			--[*l:读取到结束字符\n或者阻塞发送 ] 
	UartRecedata = UartRecedata..data	
	UartReceDataCnt =UartReceDataCnt + 1 
end
sys.reguart(1,UartRead)--注册串口1的数据接收函数,串口收到数据后,会以中断方式,调用read接口读取数据


---------开始mqtt连接--------------------------
--通过20ms循环定时器检测是否存在要发布的信息,数据来源为模块串口
sys.timer_loop_start(function() 
	if UartRecedata ~= "" then 
		mqttclient:publish(MqttPubToptic,UartRecedata)--发布主题,发布一条消息 
		UartReceDataCnt = 0
		UartRecedata = ""
	end
end,20)  

--[[功能:收到发布消息时的回调函数]]
local function ReceMessage(topic,data,qos)
	if data ~= "" then
		uart.write(1,data)--把mqtt客户端接收到的数据通过串口1发送出去
		if data=="Relay1=1"		then 
			pio.pin.setval(1,RelayPin1) 
		elseif data=="Relay1=0"		then 
			pio.pin.setval(0,RelayPin1) 
		
		elseif data=="Relay2=1"		then 
			pio.pin.setval(1,RelayPin2) 	
		elseif data=="Relay2=0"		then 
			pio.pin.setval(0,RelayPin2) 	
		
		elseif data=="Relay3=1"		then 
			pio.pin.setval(1,RelayPin3) 	
		elseif data=="Relay3=0"		then 
			pio.pin.setval(0,RelayPin4) 	
		
		elseif data=="Relay4=1"		then 
			pio.pin.setval(1,RelayPin4) 	
		elseif data=="Relay4=0"		then 
			pio.pin.setval(0,RelayPin4) 
		end	
		data =""
	end
end

--[[功能:MQTT连接断开后的回调]]
local function discb()
	print("DisconnectMqtt!!!!!")
	sys.timer_start(mqttclient:connect(misc.getimei(),240,MqttUserName,MqttUserPassword,MqttConnectSucceed,MqttConnectError),20000)
end

--[[功能:MQTT 订阅主题之后收到SUBACK的回调函数	]]
local function subSuccess()
	print("SubSuccess!!!!!")
end

--[[功能:MQTT 连接成功回调函数]]
local function MqttConnectSucceed() -- mqtt连接成功后, 同时订阅主题
	print("MqttConnectSucceed!!!!!")
	mqttclient:subscribe({{topic=MqttSubToptic,qos=0}}, subSuccess)--订阅主题
	mqttclient:regevtcb({MESSAGE=ReceMessage})	--注册事件的回调函数,MESSAGE事件表示收到了订阅的消息
end

--功能:MQTT 连接失败回调函数
local function MqttConnectError()	
	print("MqttConnectError!!!!!")		
end

--[[功能:SOCKET异常回调函数, 此处是恢复异常的一种方式<进入飞行模式,半分钟后退出飞信模式>]]
local function SocketError() 		
	print("SocketError!!!!!")			
	misc.setflymode(true)--调用库misc.lua中的函数;控制飞行模式:true为进入飞行模式,false为退出飞行模式
	sys.timer_start(misc.setflymode,30000,false)--启动定时器30秒后调用回调函数
end


--[[功能:IMEI读取成功,成功后,才去创建mqtt client,连接服务器,因为用到了IMEI号]]
local function imeirdy()
	mqttclient = mqtt.create(PROT,ADDR,PORT)
	mqttclient:connect(misc.getimei(),240,MqttUserName,MqttUserPassword,MqttConnectSucceed,MqttConnectError)--连接mqtt服务器,socket出现异常时,自动重启软件
end


--[[模块内部lib库中定义,只能使用表的形式调用]]
local procer =
{
	IMEI_READY = imeirdy,
}
--注册消息的处理函数
sys.regapp(procer)

 

通过PC端MQTT客户端发送"open"开继电器;

 

PC端mqtt客户端发送"close"关继电器

 

手机端APP测试

 

 

源码:https://download.csdn.net/download/dianzishi123/10784107

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值