资讯动态

Air780E+AT指令+EMQX:5分钟跑通MQTT双向通信实战

发布时间:2026/9/17 18:45:41 来源:尧图企业网站定制
Air780E模组用AT指令连EMQX服务器5分钟跑通MQTT双向通信——这个说法放到实战里一点不夸张。我在物联网项目里做过不少设备上云的活了每次做原型验证首选方案基本都是Air780E AT指令 EMQX因为这套组合的调试速度实在太快。你不需要去啃MQTT协议栈源码也不用烧录复杂的固件只要有一块模组、一张SIM卡、一台能跑EMQX的机器串口工具里敲几行命令消息就从设备端飞到服务器了再飞回来。这篇文章就给大家完整梳理这套流程包含每一步AT指令的含义、EMQX的部署方法、完整可复制的脚本代码以及我实际调试中踩过的几个坑。文章的整体脉络我会按照“为什么这么选型 - 环境怎么准备 - AT指令怎么敲 - 完整代码怎么抄 - 坑怎么避”来推进。不管是刚接触4G模组的嵌入式新手还是项目里急着联调的老手按着这篇文章走一遍基本能把链路跑通后面再做功能开发就有底了。1. 方案选型为什么是Air780E、AT指令和MQTT1.1 Air780E便宜能打的Cat.1全网通模组Air780E是合宙推出的一款基于紫光展锐8910平台的4G通信模组支持Cat.1标准。Cat.1在物联网圈子里这几年的存在感很强它的定位很有意思比NB-IoT带宽大、时延低比传统Cat.4模组便宜、功耗低特别适合共享设备、定位追踪、充电桩、智能表计这类中速率、需要移动性又不追求极高带宽的场景。前几年很多2G设备被迫换代Air780E就是这波切换里出货量非常可观的一款产品。这块模组支持移动、联通、电信三网也就是“全网通”不用像早期2G模组那样去分运营商版本。硬件上封装选择多核心板只要几十块钱USB连上电脑就能当4G上网卡用开发门槛真的低。我很多客户的项目从拿到模组到打通第一条MQTT消息基本一两个小时就能完成这也是我习惯把它推给赶时间团队的原因。如果单纯想验证“设备上云”这件事Air780E几乎是目前市面上成本最低、路线最短的方案之一。1.2 AT指令方案和LuatOS/CSDK方案怎么选Air780E的玩法大体分两种一种是烧录LuatOS固件用Lua或者C语言直接在模组内部跑业务逻辑省掉外部MCU另一种就是我一直推荐的AT指令方案模组只负责“无脑联网”所有业务逻辑放在外部单片机里通过串口发AT指令来控制模组。AT指令方案的优势非常明显。第一MCU端零协议负担不管是51、STM32还是国产MCU只要能收发串口数据就行第二调试透明每一行指令的返回都能直接看到出了问题不用猜第三开发人员不需要懂4G协议栈甚至不需要了解MQTT协议的具体报文格式。缺点也很直接如果你的业务逻辑很重、对功耗要求极端外部MCU和模组之间的串口通信会引入额外开销这时候LuatOS方案会更优。我的建议是原型验证、中小规模项目、团队主力是写嵌入式C的闭眼选AT指令大规模低功耗设备、想省掉外部MCU的再考虑LuatOS。这也是这篇文章把重点放在AT指令上的原因——它足够简单足够快也足够解决大多数实际问题。1.3 数据链路消息从设备到云端到底走了哪几步动手之前先把数据链路理清楚后面排查问题全靠它。整条链路大概是这样的外部MCU通过串口把AT指令发给Air780EAir780E将这些指令转换成MQTT协议报文通过4G网络发送到云端EMQX服务器EMQX再将消息路由给订阅了同一个主题的客户端比如MQTTX、微信小程序或者后台服务。所以你会发现这条链路里的主角其实有两个Air780E负责“搬运”EMQX负责“收转”。MCU、模组、服务器三者各司其职。你在串口工具里看到某条AT指令返回OK并不代表消息已经到达服务器只能说明模组接受了这条指令真正的数据到达验证要在EMQX的后台或者订阅端去看。这个认知很重要否则后面排错会被“OK了但没收到消息”这种问题折磨到怀疑人生。2. 环境准备硬件接线和EMQX部署2.1 硬件清单与串口接线的一个常见坑开始之前先准备以下东西Air780E核心板或模组开发板一块带USB转串口的最省事SIM卡一张大小卡注意匹配卡要能正常上网4G天线别小看这东西不接天线信号会差到让你怀疑是模组坏了USB转TTL工具如果核心板不带USB口就需要自己接杜邦线若干接线方面Air780E的主串口通常是用来做AT指令交互的。如果你用的是合宙官方的开发板直接用USB线连接电脑就行板载的USB转串口芯片已经帮你处理好了电平转换。如果是自己打板用模组注意Air780E的IO电平是按3.3V设计的外部MCU如果是5V的TTL电平中间一定要加电平转换芯片否则长时间运行容易烧模组IO。串口参数我默认用1152008位数据位、无校验、1位停止位这是绝大多数合宙模组的默认设置。上电后串口助手应该能看到模组打印的开机日志如果看不到先检查USB转串口的驱动有没有装好再检查是不是接错了TX/RX——这俩交叉接线是新手最容易犯的错误。记住模组的TX接你USB转TTL工具的RX模组的RX接工具的TX。2.2 EMQX部署Docker、Windows、云服务器三选一EMQX是开源的高性能MQTT消息服务器单台就能支撑海量设备连接。部署方式我推荐三种按使用场景选就行。第一种是本地Docker部署最适合开发和演示。一条命令搞定docker run -d --name emqx -p 1883:1883 -p 18083:18083 --restartalways emqx/emqx:5.8其中1883是MQTT普通协议端口18083是Dashboard后台端口。容器跑起来之后浏览器访问 http://localhost:18083 默认账号admin密码public进去就能看到设备在线状态。第二种是直接安装在Windows电脑上适合纯Windows环境的读者。去EMQX官网下载Windows安装包解压后在命令行进到bin目录执行 emqx start 就行。Dashboard端口同样是18083。第三种是部署在云服务器上适合设备需要在外网访问的场景。你需要在云服务器上放行1883端口和18083端口注意云厂商的安全组和系统防火墙策略里都要加规则。我身边不止一个人栽在这一步本地MQTTX能连EMQX设备就是连不上查半天发现是安全组没放行1883。这个事看起来基础但确实是最常见的绊脚石。2.3 创建MQTT账号并准备好连接参数EMQX 5.x默认虽然允许匿名连接但我强烈建议生产环境关掉匿名用账号密码登录。这里我们创建一个测试账号打开EMQX Dashboard找到“访问控制”里的“客户端认证”添加一个用户比如用户名iot-test密码123456。然后整理一下后面要用的连接参数最好记在文本里Broker地址EMQX所在机器的IP本地调试填127.0.0.1云服务器填公网IP端口1883客户端ID每个设备要唯一例如air780e_test_01用户名/密码iot-test / 123456订阅主题device/air780e/up发布主题device/air780e/down这里有个很重要的细节客户端ID必须全局唯一。如果两台设备用了相同的ClientID先连上的那台一定会被后连上的挤下线而且这种互踢在MQTT协议里属于“正常行为”不会报任何错误。我之前调试时明明设备在线消息却总是不对最后发现就是EMQX上的另一个测试客户端偷偷占用了同一个ClientID。3. AT指令分步实战从上电到双向通信这一节我演示Air780E上很经典的一套MQTT指令流程。旧版合宙AT固件常用的是MCONFIG/MIPSTART/MQTTSTART/MQTTSUB/MQTTPUB这套前缀新版固件有对应的标准AQM指令比如MQTTCFG/MQTTOPEN。指令名会变但底层逻辑顺序完全一致。如果你手头的固件指令对不上先查一下当前固件版本对应的AT指令手册再替换命令就行。3.1 第一步串口通信检查与关闭回显把串口助手打开波特率115200给模组上电。第一步先发个最简单的AT验证串口链路通不通AT OK如果返回OK说明MCU到模组的串口通路没问题。顺手再把回显关掉省得后面指令和返回混在一起看不清ATE0 OK有人可能会问为什么一开始要关回显因为MQTT交互的AT脚本命令比较多开着回显的话你发出去的每一行命令都会原样回显出来再叠加各种MQTT开头的结果码串口工具里的日志会乱成一锅粥。关掉回显之后输出就只有模组的主动上报和指令结果排查问题会清爽很多。3.2 第二步确认SIM卡、信号和网络注册接下来依次执行下面的命令确保模组已经具备上网条件ATCPIN? CPIN: READY ATCSQ CSQ: 20,99 ATCEREG? CEREG: 0,1ATCPIN? 返回 CPIN: READY表示SIM卡已识别。返回ERROR则是卡没插好、卡坏或者卡座接触不良先放下软件去检查硬件。ATCSQ 返回的是信号强度第一个数字越大越好一般大于10能稳定联网99表示信号不可用检查天线或者SIM卡。ATCEREG? 返回 CEREG: 0,1最后一位是网络注册状态1表示已注册到本地网5表示已注册但正在漫游0和2是还在尝试3表示被拒绝。这个命令值得多执行几次因为模组上电后注册网络本身需要一定时间。网络注册状态OK之后还需要激活PDP上下文相当于让模组申请一个动态IP。执行ATCGACT1,1 OK ATCGPADDR1 CGPADDR: 1,10.10.xx.xx拿到IP就说明模组的4G数据链路已经通了下一步才真正进入MQTT主战场。这一步相当于“宽带装好了拨号也成功了”后面才能在网络上跑业务流量。3.3 第三步配置MQTT参数并建立连接到这一步模组已经能上网了接下来把它接到EMQX上。首先配置MQTT客户端的基本参数ATMCONFIGair780e_test_01,iot-test,123456 OK这条命令的作用是设置MQTT连接的ClientID、用户名和密码。为什么这里不直接连接而是先配置因为MQTT在建立连接握手时这三样参数就是身份凭证EMQX要拿它们做认证EMQX里配了对应的账号这里才有权限放行。然后是建立TCP链路指定EMQX服务器的IP和端口ATMIPSTART120.xx.xx.xx,1883 OK如果EMQX部署在云端这里填公网IP如果只是本机测试也可以填局域网IP。返回OK只表示TCP连接建立成功不代表MQTT层已经通过认证。真正进入MQTT协议层要执行ATMQTTSTART OK到这一步EMQX的Dashboard“连接管理”页面里就能看到你的设备上线了。发完MQTTSTART后如果一直没反应或者返回ERROR优先回到上一步检查TCP链路和服务器账号密码别急着往下走。3.4 第四步订阅主题打通下行通道设备连上EMQX之后要做的第一件事就是订阅和发布。订阅是所有物联网设备最基础的动作先来订阅一个上行主题ATMQTTSUBdevice/air780e/up,0 OK命令里的0是QoS等级。MQTT协议里QoS 0是最多一次QoS 1是至少一次QoS 2是恰好一次。对于采集上行数据这种允许偶尔丢一条的场景用QoS 0完全够还省流量如果是不允许丢失的控制指令建议至少用QoS 1。我一般默认写0定期上报的场景完全没问题。订阅成功后再用MQTTX这类客户端向这个主题发一条消息串口助手应该能看到类似这样的主动上报MQTTSUB: device/air780e/up,hello from mqttx看到这条返回说明“从云端到设备”的下行链路已经打通。这是整个调试过程中最有成就感的一瞬间——设备端和云端终于“互相看得见”了。3.5 第五步发布消息打通上行通道上行链路同样简单执行ATMQTTPUBdevice/air780e/down,hello from air780e,0,0 OK MQTTPUB: 0其中引号里面是消息内容第一个0是QoS第二个0是retain标志表示这条消息是否要由服务器保留给后订阅的客户端。业务上如果需要新设备一订阅就能拿到服务器最后的状态retain填1很有用比如上报设备当前开关状态普通的临时消息填0即可。发布指令执行后模组会返回 MQTTPUB: 0 表示消息发送成功。此时打开MQTTX订阅同样的主题 device/air780e/down就能看到设备发上来的消息。至此设备端和服务器端的双向通信已经全部打通前后也就五分钟的事。这里再提醒一个真实处理经验如果你的消息内容里带了逗号或者双引号直接写在AT指令里可能会被解析错。比如要发布的内容是temp,25建议把消息体做一下URL编码或者改成JSON里不带逗号的写法实在绕不开就查一下固件手册里对特殊字符的转义规则。这个问题在调试阶段不常见一旦产品上线各种带分隔符的数据出现频率会很高。3.6 关于心跳、断开和重连的工程化处理MQTT链路测试通过后别急着把代码固化到产品里还有一个重要问题断线重连。Air780E的AT指令里断开连接是ATMQTTDISCON OK日常开发中网络环境没有那么理想信号波动、服务器重启、IP地址变化都可能导致原有MQTT连接断开。模组断开后串口会收到类似的主动上报MQTTURC: 1不同的固件上报格式不一样处理逻辑是统一的一旦收到这个上报就重新执行一遍“配置参数 - 建立TCP - 启动MQTT - 订阅主题”的完整流程。注意MQTT协议本身有keepalive机制模组会在配置的保活时间内主动发心跳包判断链路是否还通着所以业务端一般不需要额外发心跳关键是针对断线事件做好重连。4. 完整可直接抄的脚本和代码上一节是分步骤讲解这一节直接给一份“抄作业版”的完整脚本和代码框架。我的建议是先手工在串口助手里把每一步敲通再做代码集成这样排查问题时心里有数。4.1 完整AT指令序列5分钟跑通的核心下面是一份经过精简的完整AT脚本按顺序逐条发送就能完成一次MQTT连接、订阅和发布。脚本里的IP、ClientID、用户名密码记得换成你自己的ATE0 ATCPIN? ATCSQ ATCEREG? ATCGACT1,1 ATMQTTCFGair780e_test_01,iot-test,123456 ATMQTTOPEN120.xx.xx.xx,1883 ATMQTTSUBdevice/air780e/up,0 ATMQTTPUBdevice/air780e/down,hello from air780e,0,0如果你当前固件不支持MQTTCFG/MQTTOPEN前缀按照我第3节里的经典指令流程替换即可ATMCONFIG配置、ATMIPSTART建TCP链路、ATMQTTSTART启动MQTT。整个流程的逻辑骨架就是确认网络就绪 - 配置MQTT参数 - 建立TCP - 启动MQTT - 订阅/发布。只要理解了这条主线不管指令前缀怎么变你都能快速上手。4.2 单片机上运行AT指令的代码框架实测中最常用的做法是单片机通过串口发送AT指令并解析返回值。这里给一个简化版的C语言发送框架逻辑上可以套用在任意MCU上void uart_send_string(const char *str); // 串口发送函数 void uart_receive_irq_handle(void); // 串口接收中断处理 // 发送AT指令并等待预期返回值timeout_ms为超时时间 uint8_t at_send_cmd(const char *cmd, const char *expect, uint32_t timeout_ms) { uart_send_string(cmd); uart_send_string(\r\n); // 在循环中接收串口数据将结果存入缓冲区 // 在timeout_ms时间内如果缓冲区中匹配到expect字符串返回1 // 超时未匹配返回0 }实际工程中至少要做好三件事一是发送指令后不要立刻发下一条要等上一条返回OK二是对模组的主动上报比如MQTTSUB开头的内容做异步解析不能只在同步发指令时才读串口否则会丢掉服务器推送的消息三是在主循环里增加一个状态机把“上电 - 注网 - 连MQTT - 在线运行 - 断线重连”这几个状态管理起来不要把所有AT指令堆在main函数里顺序执行。4.3 用MQTTX做全链路验证设备端脚本写完之后别急着收工我强烈建议用MQTTX这种图形化客户端做一次全链路验证。手机或者电脑装一个MQTTX新建一个连接填上EMQX的IP、端口和认证信息然后订阅 device/air780e/up向 device/air780e/down 发一条消息。如果MQTTX能收到设备发来的消息设备也能收到MQTTX下发的消息那么恭喜这条链路已经是“真通”了不是只在AT指令层面返回OK。我习惯把MQTTX在前台一直开着调试设备异常时先看MQTTX能不能发能收能的话问题就锁定在设备端不能的话去查服务器和网络。这一个小习惯能省掉一半的排查时间。5. 问题速查我实测中踩过的坑这一节整理几个我自己实际调试中踩过、或者帮别人排过的典型问题按“现象 - 原因 - 解决”列表出来方便你直接按图索骥。5.1 连接问题速查表现象可能原因排查与解决方案AT返回ERROR波特率不对、TX/RX接反检查串口参数交叉换TX/RXATCPIN?返回ERRORSIM卡未识别或卡座接触不良重插SIM卡、检查卡座弹片CSQ返回99,99没接天线、天线损坏、信号太差检查天线连接移动到窗边信号好位置CEREG返回0,3SIM卡被停用、套餐停机、运营商不匹配换卡确认卡能正常上网MQTT连接失败防火墙/安全组未放行1883端口在云服务器安全组和系统防火墙放行1883连接成功但收不到消息订阅主题与发布主题不一致检查topic是否大小写、层级完全一致设备上线后频繁掉线信号弱导致TCP连接不稳定优化天线布局必要时降低设备放置高度这张表覆盖了80%的新手问题。我最常遇到的还是端口未放行因为EMQX本地测试没问题一搬到云服务器就出问题排查思路立刻转向网络策略基本一击即中。5.2 掉线自动重连产品上线前必须补上的逻辑如果你只是做个demo断线重连可以不做但产品要跑起来重连机制就是命根子。我见过太多设备在演示时异常掉线后一直傻等最后只能断电重启。最简单的做法是在单片机里开一个定时任务周期性发送一条轻量级AT指令比如AT查询模组是否还活着一旦发现MQTT断线上报或者长时间没有收到模组的任何返回就调用完整的MQTT重连流程。重连流程要先执行ATMQTTDISCON确保上一次连接彻底关闭再去重新执行ATMCONFIG、ATMIPSTART、ATMQTTSTART、ATMQTTSUB。这里有个细节重连后必须重新订阅主题因为订阅关系不会跨连接保留。另外不要做成“死循环式重连”。如果服务器长时间不可用建议指数退避第一次等5秒第二次10秒最长到5分钟否则设备一直在最耗电的状态下空转很快就把电池耗光了。5.3 固件版本不同指令别硬抄Air780E的不同固件版本AT指令集的差异是真实存在的。合宙官方早年的AT固件里MQTT用的是MCONFIG/MIPSTART/MQTTSTART这套后续新固件迭代后有些版本支持MQTTCFG/MQTTOPEN这套更标准的AQM指令两者在功能上等价但写法和返回值不完全一样。所以拿到一块Air780E第一步一定要查固件版本执行 ATCGMR 或者 ATI把版本信息记下来再对照官方AT指令手册里的MQTT部分确认指令写法。不要拿着别人文章里的指令直接复制尤其是网上文章年代跨度大很容易混入过时信息。我一开始也吃过这个亏照着旧固件文档敲了半天新固件全部返回ERROR最后查版本号才发现问题。我自己第一次调这块模组的时候其实卡在了一个特别低级的问题上EMQX在云服务器上跑着本地MQTTX连得欢天喜地Air780E死活连不上。排查了快两个小时最终发现是云服务器的安全组没放行1883端口。从那以后我就养成了习惯凡是涉及远程服务器先把端口策略理一遍再动手。这个经验也说不上多高深但真的很管用——分享给每一个准备入坑Air780E和MQTT的朋友。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价