硬件准备

硬件列表:

  • ESP32 开发板;
  • 移远 EC800K 通信模块或带稳压、SIM 卡座和天线座的开发板;
  • 可提供足够瞬时电流的独立电源;
  • 4G 天线、可用的 SIM 卡和串口连接线;
  • 如果两块板的 UART 电平不一致,还需要双向电平转换模块。

EC800K 核心模块与不同厂商开发板的供电电压可能不同,接线前必须查看手中开发板的原理图。蜂窝模块发射时会产生较大的瞬时电流,不建议直接从 ESP32 的 3V3 引脚取电,否则很容易出现反复重启、掉网或 MQTT 莫名断开的情况。

本文配套代码使用 ESP32 的 UART1,默认引脚如下:

ESP32 EC800K 说明
GPIO17(TX) RX ESP32 发送、EC800K 接收
GPIO16(RX) TX ESP32 接收、EC800K 发送
GND GND 两块板必须共地

串口参数为 115200, 8N1。如果你的 EC800K 固件使用其他波特率,需要同步修改代码中的 ec800kSerial.begin()。

PlatformIO 项目

完整代码位于 esp32-ec800k-mqtt。项目的 platformio.ini 可以保持为:

1
2
3
4
5
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200

核心代码的作用是建立一个串口透传终端:电脑串口监视器输入 AT 指令,ESP32 转发给 EC800K;模块返回的内容再打印到电脑。这样可以先把网络注册和 MQTT 指令逐条调通,再考虑封装成自动状态机。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <Arduino.h>
#include <HardwareSerial.h>

HardwareSerial ec800kSerial(1);

void setup() {
Serial.begin(115200);
ec800kSerial.begin(115200, SERIAL_8N1, 16, 17);
}

void loop() {
while (Serial.available()) {
ec800kSerial.write(Serial.read());
}
while (ec800kSerial.available()) {
Serial.write(ec800kSerial.read());
}
}

仓库中的版本使用 FreeRTOS 任务异步读取串口,并增加了缓冲区和输出过滤,更适合继续扩展。

联网前检查

插入 SIM 卡并连接天线后,先在串口监视器依次检查:

1
2
3
4
5
AT
AT+CPIN?
AT+CSQ
AT+CEREG?
AT+CGATT?

正常情况下,AT 返回 OK,CPIN 显示 SIM 卡已就绪,CEREG 表明已经注册到分组网络,CGATT 返回已附着。CSQ 用于查看信号质量;如果长时间无法注册,应先检查天线、SIM 卡、供电和当地运营商网络,而不是直接排查 MQTT。

MQTT AT 指令流程

EC800K 不同固件的 MQTT 指令参数可能略有区别,应以模块对应版本的 AT 手册为准。常见的调试顺序如下,其中地址、端口、客户端 ID 和主题都需要替换成自己的值:

1
2
3
AT+QMTOPEN=0,"broker.example.com",1883
AT+QMTCONN=0,"esp32-ec800k-client"
AT+QMTSUB=0,1,"device/test/down",0

发布消息通常使用固件支持的 QMTPUB 或 QMTPUBEX 指令,例如:

1
2
AT+QMTPUBEX=0,0,0,0,"device/test/up",18
{"temperature":25}

每一步都要等待模块的异步结果再继续,尤其是 QMTOPEN。仅收到命令行的 OK 不代表 MQTT 已经连接成功,还需要检查随后出现的 +QMTOPEN、+QMTCONN、+QMTSUB 或 +QMTPUBEX 结果码。

断开连接时可以按固件手册依次关闭 MQTT 客户端和网络连接。程序化控制时不要简单地连续发送一串 AT 指令,建议将流程拆分为“等待网络注册 → 打开连接 → 登录 → 订阅/发布 → 断线重连”几个状态,并为每个状态设置超时。

常见问题

串口完全没有响应

先交换 RX/TX,确认共地,再检查波特率和模块是否已经正常开机。有些开发板还需要拉低 PWRKEY 一段时间才能启动。

模块不断重启或一联网就掉线

优先检查供电能力和电源线压降。蜂窝模块的瞬时电流明显高于空闲状态,万用表看到的平均电压正常并不能排除电源问题。

MQTT 打不开

先确认 CEREG 和 CGATT 正常,再检查 APN、Broker 地址、端口以及服务器是否允许匿名连接。如果使用 TLS,还需要额外配置证书和 SSL 上下文。

收到 OK 但没有消息

OK 只表示 AT 命令格式被接受。继续查看 +QMT... 异步返回码,并确认发布和订阅使用的是同一个 Broker、主题及 QoS 设置。

参考资料