草庐IT

Air780E|物联网模组|AT命令|MQTT接入|云平台(1)-MQTT基本原理及AT步骤

打酱油的工程师 2024-02-11 原文

目录

基础资料

探讨重点

实现功能

硬件准备

软件版本

软件使用

串口工具

主要步骤

1、SIM卡状态检查及激活PDP

2、关于SSL配置

3、通过TCP连接到MQTT服务器

4、订阅或者发布消息

4.1 订阅主题:AT+MSUB

4.2 发布消息

4.3 注意事项:

4.4 接收消息示例


基础资料

基于Air780E开发板:Air780E文档中心

简介:AT开发

探讨重点

AT固件是通信模组或者单片机(MCU)+ 网络模块标准固件的基本配置,该模式定制化程序较高,简单易上手,但缺点也较为明显,仅用于快速基本功能验证。

本系列主要探讨MQTT方式手动接入、信息订阅及发布的基本原理,后续详细介绍接入多种云平台的基本操作及手动鉴权步骤。

实现功能

MQTT基本原理及步骤;

硬件准备

Air780E开发板1块,SIM卡1张。

软件版本

Revision: AirM2M_780E_V1108_LTE_AT

任意串口调试工具(本文使用llcom1.1.1.9,波特率9600)

软件使用

接口文档可参考:MQTT应用指南

命令手册:配套AT手册

串口工具

串口工具主界面

Air780E开发板正常开机后共3个串口:

luatools工具启动后,一般会占用2个串口用于debug及升级。

luatools工具

通用串口工具可使用另外一个串口进行AT命令调试:

调试串口选择

本例中如果不同时启动luatools工具,COM12、COM11均可用于AT命令调试(COM13接收SIM卡工作数据流,不能用于AT命令调试)。

主要步骤

该4G模块支持MQTT和MQTT SSl协议,MQTT应用的基本流程如下:

1、激活PDP

2、如果要支持SSL,配置SSL参数

3、通过TCP连接到MQTT服务器

4、发送MQTT CONNECT到服务器,打开会话连接

5、订阅或者发布消息

符号意义:←串口调试工具输入命令流,→ 串口调试工具接收到的数据流

1、SIM卡状态检查及激活PDP

←AT+CPIN?
+CPIN: READY    //查询sim卡是否正常
OK
AT+CGATT?
+CGATT: 1        //查询是否附着上数据网络,如果返回+CGATT: 0表示未附着上
← AT+CSTT     //配置网络
→ AT+CSTT
OK
← AT+CIICR   //激活网络
→ AT+CIICR
OK
← AT+CIFSR  //查询是否获取IP
→ AT+CIFSR
10.63.**.**  //获取IP,连接条件准备就绪

一般状态正常后即具备连接条件,可以进行MQTT连接步骤。

如果未能自动附着,可执行手动激活PDP步骤:

←AT+SAPBR=3,1,"CONTYPE","GPRS"
→OK
←AT+SAPBR=3,1,"APN",""    //设置APN,此处""表示使用从网络端自动获取到的APN
→OK
←AT+SAPBR=1,1             //发起激活PDP的请求
→OK
←AT+SAPBR=2,1             //注意:此命令仅仅查询PDP地址,可以不执行
→+SAPBR: 1,1,"10.159.*.***"    //请求到的PDP地址

2、关于SSL配置

如果要支持SSL,需配置SSL参数(结合各云平台接入步骤配置)。非本次介绍的重点。

3、通过TCP连接到MQTT服务器

基本语法:AT+MCONFIG=?+MCONFIG: <clientid>[,<username>,<password>[,(0-2),(0,1),<will_topic>,<will_message>]]

实例:以连接测试地址lbsmqtt.airm2m.com为例,端口:1884

← AT+MCONFIG="866289037******","user","password"
→ AT+MCONFIG="866289037******","user","password"
OK
← AT+MIPSTART="lbsmqtt.airm2m.com","1884"
→ AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
→
CONNECT OK
“CONNECT OK”指示建立连接,需尽快提交连接请求。
4、发送MQTT CONNECT到服务器,打开会话连接
← AT+MIPSTART="lbsmqtt.airm2m.com","1884"
→ AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
→
CONNECT OK
→
CLOSED                                           //由于手动建立连接后未及时进行会话连接请求,连接被关闭
← AT+MIPSTART="lbsmqtt.airm2m.com","1884"     //=连接关闭后,重新发起连接请求,
→ AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
→
CONNECT OK
←  AT+MCONNECT=1,120         //1:client 和 server 都会抛弃以前的会话,建立一个新的会话
                                              //链接保活设置为120s
→  AT+MCONNECT=1,120
OK
CONNACK OK                                    //连接建立

设备端在保活时间内至少需要发送一次报文,包括 PING 请求。 如果服务器端在保活时间内未接收到任何报文,会断开连接,设备端需要发起重连。 建议取值在 300s以上。

4、订阅或者发布消息

4.1 订阅主题:AT+MSUB

本命令从客户端到服务器,用于一个或多个订阅主题。

语法规则:AT+MSUB=<topic>,<qos>

<topic>一个或多个订阅主题

QoS服务质量,根据不同的使用场景确定。

QoS 0:最多一次 ,QoS 1,尽最大努力传递,不保证消息的传递:至少一次,保证一条消息至少一次传递给接收方;QoS 2:仅一次,保证每条消息仅由预期的收件人接收一次;

实例:lbsmqtt.airm2m.com示例topic订制

←  AT+MSUB="mqtt/sub_topic",0     //发起订阅
→  AT+MSUB="mqtt/sub_topic",0
OK
 →
SUBACK       //订阅成功,一旦有服务器端下发的topic信息,会将该信息发送到所有订阅设备

4.2 发布消息

发布消息:AT+MPUB,本命令从客户端到服务器,用于一个或多个订阅主题。

AT+MPUB=?+MPUB:<topic>,(0-2),(0-1),<message>

<topic> the topic of the application 字符串 最大 256 个字节。可以用""括住,也可以不用""

<qos> Quality of Service for application message 0 至多一次 1 至少一次 2 确保只有一次

<retain> retain flag 0 服务器不能存储这个消息也不能移除或替换任何现存的 保留消息。

1 服务器必须存储这个应用消息和它的服务等级质量 (QOS),以便它可以被分发给未来的主题名匹配的订阅者。

meassage 字符串 最大 256 个字节。可以用""括住,也可以不用""

← AT+MPUB="mqtt/pub_topic",0,0,"publish 0 payload"
→ AT+MPUB="mqtt/pub_topic",0,0,"publish 0 payload"
OK          //发布成功,服务质量qos=0                                                  
← AT+MPUB="mqtt/pub_topic",1,0,"publish 1 payload"
→ AT+MPUB="mqtt/pub_topic",1,0,"publish 1 payload"
OK
→
PUBACK                                 //服务质量:qos=1
← AT+MPUB="mqtt/pub_topic",2,0,"publish 2 payload"
→ AT+MPUB="mqtt/pub_topic",2,0,"publish 2 payload"
OK
→
PUBREC
PUBCOMP                                //服务质量:qos=2

QoS:服务质量

4.3 注意事项

1、发送MIPSTART命令后,收到OK仅仅表示4G模块开始处理这条命令,并不表示TCP已经连接成功;只有收到CONNECT OK才是成功的应答(其余错误应答,参考AT手册)

2、发送MCONNECT命令后,收到OK仅仅表示4G模块开始处理这条命令,并不表示MQTT已经连接成功;只有收到CONNACK OK才是成功的应答(其余错误应答,参考AT手册)

3、发送MSUB命令后,收到OK仅仅表示4G模块开始处理这条命令,并不表示MQTT已经订阅成功;只有收到SUBACK才是成功的应答(其余错误应答,参考AT手册)

4、发送MPUB命令后,如果QOS不是0,则收到OK仅仅表示4G模块开始处理这条命令,并不表示MQTT已经发布成功;只有收到PUBACK(QOS为1时)或者PUBCOMP(QOS为2时)才是成功的应答(其余错误应答,参考AT手册)

4.4 接收消息示例

AT+MCONFIG="8662890******","user","password"
OK
AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
CONNECT OK
AT+MCONNECT=1,60
OK
CONNACK OK
AT+MSUB="mqtt/sub_topic",0
OK
SUBACK
AT+MPUB="mqtt/sub_topic",0,0,"123456"
//在mqtt/sub_topic上收到订阅消息,payload为123456
//默认是直接输出收到的订阅消息,不做缓存
+MSUB: "mqtt/sub_topic",6 byte,123456
//设置订阅消息的处理模式,设置为缓存模式
//接下来收到订阅消息时,会提示订阅消息的缓存位置
AT+MQTTMSGSET=1
OK
//在mqtt/sub_topic上收到一条订阅消息,缓存到位置0
+MSUB: 0
//主动读取缓存的所有订阅消息
AT+MQTTMSGGET
+MSUB:mqtt/sub_topic,6 byte,123456
OK
//在mqtt/sub_topic上收到一条订阅消息,缓存到位置0
+MSUB: 0
//在mqtt/sub_topic上收到一条订阅消息,缓存到位置1
+MSUB: 1
//主动读取缓存的所有订阅消息
AT+MQTTMSGGET
+MSUB:mqtt/sub_topic,6 byte,123456
+MSUB:mqtt/sub_topic,6 byte,123456
OK

有关Air780E|物联网模组|AT命令|MQTT接入|云平台(1)-MQTT基本原理及AT步骤的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  3. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  4. ruby - 导轨 4 : column reference "updated_at" is ambiguous with Postgres - 2

    我正在尝试使用“updated_at”字段的日期时间范围查询数据库。前端在JSON数组中发送查询:["2015-09-0100:00:00","2015-10-0223:00:00"]在RailsController中,我使用以下方法将两个字符串解析为DateTime:start_date=DateTime.parse(params[:date_range_arr][0])end_date=DateTime.parse(params[:date_range_arr][1])#...@events=@events.where('updated_atBETWEEN?AND?,start_d

  5. ruby - 从 Ruby : capturing the output while displaying the output? 运行 shell 命令 - 2

    我有一个问题。我想从另一个ruby​​脚本运行一个ruby​​脚本并捕获它的输出信息,同时让它也输出到屏幕。亚军#!/usr/bin/envrubyprint"Enteryourpassword:"password=gets.chompputs"Hereisyourpassword:#{password}"我运行的脚本文件:开始.rboutput=`runner`putsoutput.match(/Hereisyour(password:.*)/).captures[0].to_s正如您在此处看到的那样,存在问题。在start.rb的第一行,屏幕是空的。我在运行程序中看不到“输入您的密

  6. ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库? - 2

    有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/

  7. ruby - 在 Ruby 的 if 语句中检查 bash 命令 - 2

    如何在Ruby的if语句中检查bash命令的返回值(true/false)。我想要这样的东西,if("/usr/bin/fswscell>/dev/null2>&1")has_afs="true"elsehas_afs="false"end它会提示以下错误含义,它总是返回true。(irb):5:warning:stringliteralincondition正确的语法是什么?更新:/usr/bin/fswscell寻找afs安装和运行状态。它会抛出这样的字符串,Thisworkstationbelongstocell如果afs没有运行,命令以状态1退出 最

  8. ruby - 可以正常中断的来自 Rake 的长时间运行的 shell 命令? - 2

    在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa

  9. ruby - Capistrano 中的执行、测试和捕获命令有什么区别? - 2

    关于SSHkit-Github它说:Allbackendssupporttheexecute(*args),test(*args)&capture(*args)来自SSHkit-Rubydoc,我明白execute实际上是test的别名?test之间有什么区别?,execute,capture在Capistrano/SSHKit中我应该什么时候使用? 最佳答案 执行只是执行命令。使用非0退出引发错误。测试方法的行为与execute完全相同,但是它返回bool值(true如果命令以0退出,而false否则)。它通常用于控制任务中的流程

  10. ruby - 如何在 Ruby 中执行 Windows CLI 命令? - 2

    我在目录“C:\DocumentsandSettings\test.exe”中有一个文件,但是当我用单引号编写命令时`C:\DocumentsandSettings\test.exe(我无法在此框中显示),用于在Ruby中执行命令,我无法这样做,我收到的错误是找不到文件或目录。我尝试用“//”和“\”替换“\”,但似乎没有任何效果。我也使用过系统、IO.popen和exec命令,但所有的努力都是徒劳的。exec命令还使程序退出,这是我不想发生的。提前致谢。 最佳答案 反引号环境就像双引号,所以反斜杠用于转义。此外,Ruby会将空格解

随机推荐