目录名称

  • 如何用开发板实现mqtt功能
    • 简介
    • 材料准备
    • 步骤
    • 常见问题
    • 相关资料以及购买链接

如何用开发板实现mqtt功能

简介

MQTT 指南
mqtt是物联网中最常用的功能,本文介绍如何用Air724开发板,进行mqtt数据订阅,发布,接收的功能演示。

材料准备

  1. EVB_Air724UG_A13开发板一套,包括天线SIM卡,USB线。

  2. luat开发环境:环境搭建方法

步骤

本文以demo\mqtt\sync\sendWaitRecv这个DEMO为例做演示。

  1. 我们可以通过MQTT.fx工具来测试mqtt运行状况,我们这里和脚本连接同一个MQTT服务器,用来监视MQTT运行状态。我们脚本里会10秒钟发布一个/qos0topic主题的数据,20秒钟会发布一个/中文qos1topic主题的数据,监视结果如下。可以看到/qos0topic主题的数据的数据是/中文qos1topic主题的数据的2倍。

  2. 代码分析

  • mqttTask.lua实现的是建立一个mqtt的流程和异常处理机制。要先等待网络就绪了才可以做mqtt相关操作,这里的等待超时时间位5分钟,如果模块等待5分钟还没注册上网络的话,会通过进入飞行模式和退出飞行模式的方法重启一下协议栈。
--启动MQTT客户端任务
sys.taskInit(function()local retryConnectCnt = 0while true doif not socket.isReady() thenretryConnectCnt = 0--等待网络环境准备就绪,超时时间是5分钟sys.waitUntil("IP_READY_IND",300000)end         if socket.isReady() thenlocal imei = misc.getImei()--创建一个MQTT客户端local mqttClient = mqtt.client(imei,600,"user","password")else--进入飞行模式,20秒之后,退出飞行模式net.switchFly(true)sys.wait(20000)net.switchFly(false)endendend
)
  • 创建MQTT客户端,并连接,这里clientId用的时设备的IMEI号,设置的心跳时间为600秒,连接类型这里用的是’tcp’,支持’tcp’和’tcp_ssl’两种连接方式,可以根据实际需求来选择不同的连接方式。
   --创建一个MQTT客户端local mqttClient = mqtt.client(imei,600,"user","password")--连接MQTTmqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp")
  • 主题订阅和数据的发布和接收,这里订阅了topic为"/event0"和"/中文event1"为的2这个主题,这里通过while循环处理接收和发送的数据。
if mqttClient:subscribe({["/event0"]=0, ["/中文event1"]=1}) thenmqttOutMsg.init()--循环处理接收和发送的数据while true doif not mqttInMsg.proc(mqttClient) then log.error("mqttTask.mqttInMsg.proc error") break endif not mqttOutMsg.proc(mqttClient) then log.error("mqttTask.mqttOutMsg proc error") break endendmqttOutMsg.unInit()end
  • 数据接收的处理是在mqttInMsg.lua脚本中实现的,这里通过在while循环里调用mqttc:receive()函数来实现的,这里设置的超时时间为60秒,60秒没收到数据的话会跳出次循环。
--- MQTT客户端数据接收处理
-- @param mqttClient,MQTT客户端对象
-- @return 处理成功返回true,处理出错返回false
-- @usage mqttInMsg.proc(mqttClient)
function proc(mqttClient)local result,datawhile true doresult,data = mqttClient:receive(60000,"APP_SOCKET_SEND_DATA")--接收到数据if result thenlog.info("mqttInMsg.proc",data.topic,string.toHex(data.payload))--TODO:根据需求自行处理data.payloadelsebreakendendreturn result or data=="timeout" or data=="APP_SOCKET_SEND_DATA"
end
  • 数据发送的处理是在mqttOutMsg.lua中实现的,发送的消息是通过消息队列维护的,要发送的数据先通调用insertMsg()函数插入要发送的消息到msgQueue,等之前的数据发送完成后会通过调用proc()函数从msgQueue队列中取出第一个消息,通过调用mqttClient:publish()函数,真正的把数据发送出去。这里定时发送是通过在回调函数里启动定时的方式实现的。
--数据发送的消息队列
local msgQueue = {}--插入发发送的数据到消息队列
local function insertMsg(topic,payload,qos,user)table.insert(msgQueue,{t=topic,p=payload,q=qos,user=user})sys.publish("APP_SOCKET_SEND_DATA")
end--主题为"/qos0topic"的消息回调函数
local function pubQos0TestCb(result)log.info("mqttOutMsg.pubQos0TestCb",result)if result then sys.timerStart(pubQos0Test,10000) end
end--插入主题为"/qos0topic"的消息到消息队列
function pubQos0Test()insertMsg("/qos0topic","qos0data",0,{cb=pubQos0TestCb})
end--主题为"/中文qos1topic"的消息回调函数
local function pubQos1TestCb(result)log.info("mqttOutMsg.pubQos1TestCb",result)if result then sys.timerStart(pubQos1Test,20000) end
end--插入主题为"/中文qos1topic"的消息到消息队列
function pubQos1Test()insertMsg("/中文qos1topic","中文qos1data",1,{cb=pubQos1TestCb})
end--从消息队列中取出消息,发送到服务器
function proc(mqttClient)while #msgQueue>0 dolocal outMsg = table.remove(msgQueue,1)local result = mqttClient:publish(outMsg.t,outMsg.p,outMsg.q)if outMsg.user and outMsg.user.cb then outMsg.user.cb(result,outMsg.user.para) endif not result then return endendreturn true
end
  • log解析,服务器连接,这个也实际上也是通过SOCKET连接的,连接方式TCP,超时时间也是默认的120S

数据发送,可以看出"/qos0topic"主题是10S一次,"/中文qos1topic"主题是20S一次

数据接收,通过MQTT.fx工具,发送一个主题为"/event0"的消息,模块正常收到,并打印出来。
发送

这里打印出的数据是HEX格式的,可以看出接收的数据是也是正确的

完整代码,直接下载\demo\mqtt\sync\sendWaitRecv下的脚本即可。

常见问题

连接服务器失败

  1. 使用mqtt.fx,连接服务器确认一下是否可以连接成功,排除服务器故障
  2. 检查下模块信号、网络注册、网络附着、PDP激活状态
  3. 检查下SIM卡是否欠费【4G模块有一种欠费表现:无法注册4G网络,可以注册2G网络】

频繁掉线是什么原因

  1. 检查下是否存在代码逻辑错误,导致异常
  2. 检查下是否不断重启,导致异常
  3. 检查下服务器网络是否稳定,不要用内网穿透方式搭建服务器
  4. 检查下使用环境是否网络覆盖不好,例如车库、地下、电梯、山区等
  5. 排查是否为设备天线问题

如何实现掉线自动重连

  1. 参考mqtt demo,实现自动重连即可

相关资料以及购买链接

  • Air724UG开发板购买链接
  • Air724 开发板使用说明

示例-Luat示例-MQTT相关推荐

  1. 示例-Luat示例-HTTP

    目录名称 如何用开发板实现http功能 简介 材料准备 步骤 HTTPS双向验证流程 常见问题 相关资料以及购买链接 如何用开发板实现http功能 简介 HTTP 指南 http是物联网中常用的功能, ...

  2. 指南-示例-luat示例-camera

    关键词:camera,摄像头 如何用开发板实现camera功能 目录名称 如何用开发板实现camera功能 简介 材料准备 步骤 常见问题 相关资料以及购买链接 简介 Air724UG支持一路摄像头接 ...

  3. mqtt协议调用示例(包括MQTT一键启动服务+测试工具 MQTTFX云盘下载),对捷顺门禁温感一体机进行人员信息下发

    hello, 大家好 我是一只不是在戏精,就是在戏精路上的极品二哈 新年上班第一天,给大家贡献一篇 MQTT 协议使用示例文章 也是本汪自己的一篇实用笔记 本汪先总的说下: MQTT协议进行数据交互, ...

  4. php大于等于符号怎么打出来_PHP常用的特殊运算符号(连续小于符号,三个小于符号,eot,eod,echo示例,print示例)...

    最近在写PHP程序的时候发现了一些特殊的PHP符号,例如连续小于符号,三个小于符号,eot,eod,echo示例,print示例等,突然间发现用这么久的PHP了,竟然连PHP的基本符号都没有认全,看到 ...

  5. java udp 心跳,udp简略通讯示例-心跳示例

    当前位置:我的异常网» 软件架构设计 » udp简略通讯示例-心跳示例 udp简略通讯示例-心跳示例 www.myexceptions.net  网友分享于:2013-09-04  浏览:44次 ud ...

  6. 示例程序 示例一、由 CLSID 得到 ProgID......

    五.示例程序 示例一.由 CLSID 得到 ProgID.(程序以 word 为例子.如果运行不正确,嘿嘿,你没有安装 word 吧?) ::CoInitialize( NULL );HRESULT ...

  7. python程序示例-python示例程序

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! usrbinpython-- coding: utf-8 --num=[]; i= ...

  8. Luat模块应用手册-示例-Luat DEMO-长连接超低功耗方案

    如何用开发板实现 低功耗长连接 功能 目录名称 如何用开发板实现 低功耗长连接 功能 简介 材料准备 步骤 实现代码 常见问题 相关资料以及购买链接 简介 socket是物联网中最常用的功能,本文介绍 ...

  9. 示例-AT示例-阿里云

    阿里云连接流程 AT示例 目录名称 阿里云连接流程 AT示例 应用概述 步骤 材料准备 连接阿里云 一机一密AT HTTP鉴权连接 一机一密AT直连MQTT 一型一密AT方式连接 发布与订阅消息 发布 ...

最新文章

  1. LIVE 预告 | 达摩院王玮:超大规模中文理解生成联合模型PLUG
  2. zynq学习06 zynq的PL中加入的AXI_GPIO IP核来控制GPIO操作
  3. 计算机网络按功能自底而上划分,大连理工大学2011计算机期末模拟题3
  4. VS2015 error LNK2019 无法解析的外部符号 _WinMain@16,该符号在函数 int __cdecl invoke_main(void)
  5. html5标签详解,HTML5中figcaption标签用法详解
  6. 2021上饶市高考中考成绩查询,2021年上饶中考成绩公布查询时间 上饶中考成绩查询方式入口...
  7. Java 并发(JUC 包-04)
  8. 在一个请求分页系统中,分别采用 FIFO、LRU和 OPT页面置换算法时,假如一个作业的页面走向为 4、3、2、1、4、3、5、4、3、2、1、5,当分配给该作业的物理块数M分别为 3、4时,
  9. lnmp mysql 哪个好_[LNMP]Mysql生产环境配置
  10. EasyUI 1.5.1 美化主题大包 Insdep Theme 1.0.3 已发布,开源下载
  11. java根据id查询名字_Mybatis根据id查询用户信息
  12. JavaEE下宠物领养网站的设计与实现
  13. cass二次开发vba和lisp_CAD二次开发LISP视频_小懒人CAD工具箱_CAD插件_CASS插件_LISP代码...
  14. 访问服务器根目录文件,可道云 访问服务器根目录
  15. python什么叫索引_python中索引是什么意思(一文详解其定义)
  16. 一文详细理解计算机网络 - 物理层(考试和面试必备)
  17. 为MacBook制作一个随身携带的windows系统
  18. freemarker 遍历 map
  19. Metasploit的简单应用
  20. 相控阵天线方位角俯仰角matlab画图,基于相控阵天线测试的波束指向角计算方法...

热门文章

  1. 编写函数求区间[200,3000]中所有的回文数, 回文数是正读和反读都是一样的数
  2. lavarvel框架路由
  3. Google 就业岗分析
  4. PHP拼团人数不能超过,怎么解决拼团、抽奖难以凑齐人数这个大问题?
  5. 游戏《一战封神》副本星宿神殿挑战攻略
  6. ISCC-2019部分wp
  7. WebRTC系列-RTCDataChannel发送非音视频数据
  8. 微信订阅号和服务器,微信订阅号与服务号有什么不同?
  9. Verilog中的!和~
  10. JS实现元素拖拽,简单悬浮框实现