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"关继电器
源码:https://download.csdn.net/download/dianzishi123/10784107