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_7pio.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 = 0UartRecedata = ""end
end,20) --[[功能:收到发布消息时的回调函数]]
local function ReceMessage(topic,data,qos)if data ~= "" thenuart.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
Air202学习 四 (模块mqtt通信控制继电器)相关推荐
- python多线程编程模块不包括_python 学习_第四模块 并发编程(多线程)
python 学习_第四模块 并发编程(多线程) 一 开启线程方式 from threading importThreadimporttimedefsay(name): time.sleep(2)p ...
- 基于STM32的ESP8266模块控制多路继电器
基于STM32的ESP8266模块控制多路继电器 1.视频讲解 基于STM32单片机ESP8266物联网阿里云MQTT多路继电器控制 物联网视频教程STM32+ESP8266 2.实物设计 ESP82 ...
- python学习四(处理数据)
python学习四(处理数据) head first python中的一个数据处理的例子 有四个U10选手的600米成绩,请取出每个选手跑的最快的3个时间.以下是四位选手的9次成绩 James 2-3 ...
- 学习之模块架构 DotNetNuke 6
前面的博客介绍了: 如何在本地安装DNN6 如何创建DNN模块 博客园原文地址 : 学习之模块架构 DotNetNuke 6 这篇博客主要是讲模块的架构和加载,以及模块与DotNetNuke门户网站 ...
- (转)SpringMVC学习(四)——Spring、MyBatis和SpringMVC的整合
http://blog.csdn.net/yerenyuan_pku/article/details/72231763 之前我整合了Spring和MyBatis这两个框架,不会的可以看我的文章MyBa ...
- 第四模块MySQL数据库
第四模块MySQL数据库 从今天开始,我们将进入系列课程的 第四模块 的学习,这个模块就是给大家讲解MySQL数据库. 以前,在开发程序时,我们会把很多的数据和信息存储到某个文件夹中的文件中,例如:u ...
- RETAS HD更新2009年最终版四模块集成安装包
RETAS HD更新2009年最终版四模块集成安装包 RETAS!PRO HD 系列是在1993年发布的一套完整的数码动画制作工具,它取代了原先手工制作的塞璐璐与胶片,仅在一台个人电脑上就实现了动画制 ...
- 【PLC学习四】散装上料例子学习(1)
[PLC学习四]散装上料例子学习(1) 目录 **[PLC学习四]散装上料例子学习(1)** **一.散装上料** **二.项目设计需求** **三.PLC程序** 一.散装上料 散装上料的最终目的: ...
- C#多线程学习(四) 多线程的自动管理(线程池) (转载系列)——继续搜索引擎研究...
在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPo ...
- Python学习--Selenium模块
1. Python学习--Selenium模块介绍(1) 2.Python学习--Selenium模块学习(2) 其他: 1. Python学习--打码平台 转载于:https://www.cnblo ...
最新文章
- 充血模型的ORM能做什么?——ORM组件XCode(十八般武艺)
- Java--图片浏览器
- mysql 自动补齐 表名,列名 方法, 重启mysql方法
- java 继承和内部类_Java自学-接口与继承 内部类
- Linux学习笔记-Linux下的设备文件
- finereport报表设计中模板数据集的sql语句中if的用法_报表工具中动态参数的灵活运用...
- 小学教师计算机应用水平和能力,中小学教师信息技术应用能力的现状与对策
- IntelliJ IDEA 开启很慢,运行不流畅,大项目卡顿?一招配置解决!
- lodop指定打印机打印_2020年打印机推荐选购,看这篇就够了
- HBase常用命令(超全超详细)
- 教你如何弹好吉他-合理的安排你的练习时间
- 区块链、人工智能和物联网之间是什么关系?
- 弹性网卡支持私网多IP
- 微擎弹出确认授权获取用户头像
- Windows环境下的视图之间切换快捷键及几个常用快捷键
- 【Java】所有做过的面试题
- Linux平台被勒索软件REvil盯上
- 吴文俊:数学机械化——回顾与展望
- GNSS入门1-误差
- 2020,那些惊艳我的产品迭代
热门文章
- kron matlab_使用kron来实现repmat, repelem的功能
- html radio 更换图片,CSS 点击radio实现两个图片样式切换并且多个radio中只能有一个checked...
- Windows电脑上不错的五款办公软件
- idea 导出项目到eclipse
- 设置360浏览器默认以极速模式打开
- vue 动态渲染表格序号列
- mac操作系统如何访问共享计算机,windows电脑怎么访问苹果电脑共享文件夹
- linux用独显运行steam,如何使用Steam Play在Linux上玩几乎所有Windows游戏 | MOS86
- 「新手指南」如何在Mac上格式化U盘和移动硬盘?
- [生存志] 第11节 历代大事件概览 春秋