4G Cat.1模组AT指令开发实战:MQTT通信与远程固件升级

📅 2026/8/24 3:57:10
4G Cat.1模组AT指令开发实战:MQTT通信与远程固件升级
4G Cat.1模组AT指令开发实战MQTT通信与远程固件升级物联网设备联网方案里4G Cat.1模组是目前性价比最高的选择。Cat.4模组功耗大、成本高NB-IoT带宽太窄传不了固件Cat.1正好卡在中间下行峰值10Mbps上行5Mbps够用模组价格降到50元以内成本可控。移动、电信、联通三家都支持不需要担心覆盖问题。但Cat.1模组的AT指令开发有不少坑。不同厂家的指令集有差异MQTT连接参数配置容易出错OTA固件升级涉及断点续传和CRC校验。本文以合宙Air724UG和移远EC800N两款主流Cat.1模组为例分享AT指令开发的核心流程。### 常见Cat.1模组对比| 模组 | 厂商 | 封装 | MQTT | HTTP | OTA | 参考价格 || — | — | — | — | — | — | — || Air724UG | 合宙 | LCCLGA | 内置AT | 内置AT | FOTA | 约35元 || EC800N | 移远 | LCCLGA | 内置AT | 内置AT | FOTA | 约45元 || ML302 | 中移 | LCC | 内置AT | 内置AT | FOTA | 约40元 || EC800G | 移远 | LGA | 内置AT | 内置AT | FOTA | 约55元 |Air724UG价格最低文档和社区支持好合宙的wiki和论坛比较活跃。EC800N在稳定性和射频性能上略强工业场景用得多。基础通信配置不管用哪款模组第一步都是初始化和注网。以Air724UG为例bashATATCPIN?ATCSQATCGATT?ATCOPS?CSQ值低于15说明信号差需要检查天线或者换个位置。如果CGATT返回0说明没有附着到GPRS网络可能是SIM卡欠费或者模组还没完成注网等10-20秒再查。### MQTT连接与数据上报Air724UG内置了MQTT客户端通过AT指令配置连接参数后直接收发消息不需要在MCU上跑MQTT协议栈。bashATMCONFIGdevice_001,broker.huwangkeji.com,1883,60,user,passATMCONNECT1ATMSUBdevice/device_001/cmd,1ATMPUBdevice/device_001/data,1,0,{temp:25.6}QoS为1时模组会等待Broker的PUBACK确认网络不好会重发增加约200ms延迟。QoS为0发完就不管了适合高频低价值的数据上报。下行指令通过URC主动上报通知MCUbashMSUBRCV: device/device_001/cmd,42,{cmd:set_interval}MCU通过串口解析这个URC提取主题名和消息体执行对应控制逻辑。### 远程固件升级FOTAOTA是Cat.1模组开发中最复杂的功能。整个流程涉及固件打包、HTTP下载、断点续传、CRC校验、分区切换。bashATCFOTAhttp://ota.huwangkeji.com/fw/v2.1.0.binATCFOTADL1ATCFOTASET1EC800N的FOTA指令略有不同用ATQFOTAINST和ATQFOTAREBOOT但流程一样下载、校验、切换、回退。MCU端AT指令驱动代码在STM32或ESP32上驱动Cat.1模组核心是串口收发和URC解析。以下是基于STM32 HAL库的简化实现c#include main.h#include string.h#define UART_BUF_SIZE 512static uint8_t uart_rx_buf[UART_BUF_SIZE];static uint16_t uart_rx_len 0;int at_send_expect(UART_HandleTypeDef *huart, const char *cmd, const char *expect, uint32_t timeout_ms) { uart_rx_len 0; memset(uart_rx_buf, 0, UART_BUF_SIZE); HAL_UART_Transmit(huart, (uint8_t*)cmd, strlen(cmd), 100); HAL_UART_Transmit(huart, (uint8_t*)\r\n, 2, 100); uint32_t start HAL_GetTick(); while (HAL_GetTick() - start timeout_ms) { if (uart_rx_len 0) { uart_rx_buf[uart_rx_len] 0; if (strstr((char*)uart_rx_buf, expect) ! NULL) return 0; if (strstr((char*)uart_rx_buf, ERROR) ! NULL) return -1; } HAL_Delay(10); } return -2;}void at_urc_handler(const char *urc) { if (strncmp(urc, MSUBRCV:, 9) 0) { char topic[64] {0}; char payload[256] {0}; int len 0; if (sscanf(urc, MSUBRCV: %[^],%d, topic, len) 2) { const char *p strchr(urc 9, ); if (p) { strncpy(payload, p, sizeof(payload) - 1); handle_mqtt_message(topic, payload); } } } else if (strncmp(urc, CFOTADL:, 9) 0) { int progress 0; sscanf(urc, CFOTADL: %d, progress); }}int mqtt_publish_telemetry(UART_HandleTypeDef *huart, const char *device_id, float temp, float hum) { char cmd[256]; char payload[128]; snprintf(payload, sizeof(payload), {temp:%.1f,hum:%.1f}, temp, hum); snprintf(cmd, sizeof(cmd), ATMPUBdevice/%s/data,1,0,%s, device_id, payload); return at_send_expect(huart, cmd, MPUB:, 5000);}at_send_expect是阻塞式的在RTOS环境里应该放在独立任务中调用。URC处理通过串口空闲中断回调触发解析完主题和payload后调用应用层处理函数。### 常见问题排查MQTT连接失败。先用ATCSQ检查信号信号低于15换位置或换天线。再用ATCGATT?确认已注网。如果信号和注网都正常但MQTT连不上检查Broker认证信息以及1883端口是否被防火墙拦截。OTA下载中断。Cat.1网络在弱信号区可能掉线下载到一半断了。Air724UG支持断点续传重新发送ATCFOTADL1会从断点继续。建议在固件服务器上配置Range请求支持。串口数据丢失。Cat.1模组串口波特率默认115200弱信号区MQTT大量数据涌入时可能溢出MCU接收缓冲区。把波特率提到460800或者启用硬件流控CTS/RTS。模组死机不响应。加喂狗机制。MCU定期发AT测试指令连续3次无响应就拉低模组PWRKEY引脚强制重启。模组重启后重新走初始化流程注网、MQTT连接、订阅主题。虎王科技在物联网通信模组选型和AT指令开发方面有丰富的工程经验相关开源工具和项目可以在GitHubgithub.com/huwangkeji找到博客heicat.com上有更多通信模组开发的技术笔记。