ML307 4G 模块连接阿里云物联网平台调试全记录
一、硬件环境
| 项目 | 型号/规格 |
|---|---|
| 4G 模组 | ML307R |
| 主控 | 粤嵌 STM32F407 开发板 |
| SIM 卡 | 中国移动物联网卡 |
| 天线 | 4G 棒状天线 |
| 串口调试 | USB 转 TTL (CH340/CP2102) |
接线说明
| ML307 引脚 | USB转TTL / STM32 | 说明 |
|---|---|---|
| VCC | 3.3V / 5V | 建议用独立 5V/2A 供电 |
| GND | GND | 共地 |
| TX | RX | 模块发送 |
| RX | TX | 模块接收 |
| EN/CH_PD | 3.3V | 必须接高电平 |
二、阿里云平台配置
1. 创建产品
-
产品名称:
4G连接测试 -
节点类型:直连设备
-
认证方式:设备密钥
2. 添加设备
- 设备名称:
test
3. 获取关键参数
| 参数 | 值 | 备注 |
|---|---|---|
| ProductKey | k067yCVEsI7 |
注意是字母 I,不是数字 1 |
| DeviceName | test |
|
| DeviceSecret | 55dc839af070b6bdced81406eae1e29f |
|
| MQTT 服务器 | iot-06z00ab4mcvi9le.mqtt.iothub.aliyuncs.com |
专有域名 |
| 端口 | 1883 | 非加密 |
4. 创建物模型属性
-
功能名称:温度
-
标识符:
temperature -
数据类型:float
-
必须点击"发布上线",否则平台不会接收数据
三、核心问题及解决过程
问题 1:数据连接无法激活,返回 +CME ERROR: 50
尝试过的错误指令:
bash
AT+MIPCALL=1,1 # 返回 +CME ERROR: 50
解决方案:改用标准 3GPP 指令激活 PDP
bash
AT+CGDCONT=1,"IP","CMIOT"
AT+CGACT=1,1
AT+CGPADDR=1 # 应返回 +CGPADDR: 1,"10.xxx.xxx.xxx"
✅ 成功 :获取到 IP 地址 10.211.63.221
问题 2:MQTT 连接失败,返回 +MQTTURC: "conn",0,6
原因:
-
ProductKey 中的字母
I和数字1混淆 -
securemode参数不匹配
错误写法:
bash
# ProductKey 误写为数字 17
k067yCVEs17.test|...
正确写法:
bash
k067yCVEsI7.test|securemode=3,signmethod=hmacsha256,timestamp=1774248293294|
关键点:
-
ProductKey 必须是
k067yCVEsI7(字母 I) -
securemode=3对应非加密端口 1883 -
clientId 末尾必须有竖线
|
问题 3:MQTT 连接成功但上报数据失败,返回 ERROR 或 +CME ERROR: 601
原因:
-
一步法指令太长,超过模块缓冲区
-
JSON 长度计算错误
-
转义字符处理问题
解决方案:使用两步法上报
第一步:
bash
AT+MQTTPUB=0,"/sys/k067yCVEsI7/test/thing/event/property/post",0,0,0,42
等待模块返回 >
第二步:
bash
{"id":"1","params":{"temperature":25.5}}
✅ 成功返回 :+MQTTPUB: 0,34125,93 和 OK
问题 4:域名错误导致连接失败
错误域名:
text
iot-06z00ab4mcv91e.mqtt.iothub.aliyuncs.com # mcv91e 是错的
正确域名:
text
iot-06z00ab4mcvi9le.mqtt.iothub.aliyuncs.com # mcvi9le 正确
四、最终成功的完整 AT 指令流程
1. 激活数据连接
bash
AT+CGDCONT=1,"IP","CMIOT"
AT+CGACT=1,1
AT+CGPADDR=1
2. 配置 MQTT
bash
AT+MQTTCFG="version",0,4
3. 连接阿里云 MQTT 服务器
bash
AT+MQTTCONN=0,"iot-06z00ab4mcvi9le.mqtt.iothub.aliyuncs.com",1883,"k067yCVEsI7.test|securemode=3,signmethod=hmacsha256,timestamp=1774248293294|","test&k067yCVEsI7","6a2a4108eedcb4dd2e01a23051f15f425b304828cbdbf293c871bac3b36b7a9a"
✅ 返回:+MQTTURC: "conn",0,0
4. 上报数据(两步法)
bash
AT+MQTTPUB=0,"/sys/k067yCVEsI7/test/thing/event/property/post",0,0,0,42
# 等待模块返回 '>'
{"id":"1","params":{"temperature":25.5}}
✅ 返回:+MQTTPUB: 0,34125,93 和 OK
5. 订阅平台下发指令
bash
AT+MQTTSUB=0,"/sys/k067yCVEsI7/test/thing/service/property/set",2
✅ 返回:+MQTTSUB: 0,1,0,0
五、关键参数汇总
| 参数 | 正确值 |
|---|---|
| APN | CMIOT |
| MQTT 服务器 | iot-06z00ab4mcvi9le.mqtt.iothub.aliyuncs.com |
| 端口 | 1883 |
| ProductKey | k067yCVEsI7(注意是字母 I) |
| DeviceName | test |
| Client ID | `k067yCVEsI7.test |
| Username | test&k067yCVEsI7 |
| Password | 6a2a4108eedcb4dd2e01a23051f15f425b304828cbdbf293c871bac3b36b7a9a |
| 上报主题 | /sys/k067yCVEsI7/test/thing/event/property/post |
| 订阅主题 | /sys/k067yCVEsI7/test/thing/service/property/set |
| JSON 格式 | {"id":"1","params":{"temperature":25.5}} |
六、常见错误码及含义
| 错误码 | 含义 | 解决方法 |
|---|---|---|
+CME ERROR: 50 |
PDP 激活失败 | 检查 APN,用 AT+CGACT 激活 |
+CME ERROR: 100 |
网络未注册 | 检查天线、SIM 卡、信号 |
+CME ERROR: 601 |
MQTT 连接断开 | 重新连接 MQTT |
+CME ERROR: 607 |
资源被占用 | 先执行 AT+MQTTDISC=0 清理 |
+MQTTURC: "conn",0,2 |
服务器拒绝连接 | 检查 ProductKey、clientId 格式 |
+MQTTURC: "conn",0,6 |
用户名/密码错误 | 检查 ProductKey、DeviceName、password |
七、经验总结
-
激活数据连接用
AT+CGACT,不要用AT+MIPCALL -
MQTT 连接参数中 ProductKey 要区分字母 I 和数字 1
-
域名必须正确 :
mcvi9le不是mcv91e -
上报数据用两步法 :先发
AT+MQTTPUB=0,...,42,等>再发 JSON -
JSON 长度必须准确 :
{"id":"1","params":{"temperature":25.5}}是 42 个字符 -
订阅指令确认 MQTT 通道是否正常
八、下一步建议
-
将 AT 指令流程移植到 STM32F407 代码中
-
接入温湿度传感器(如 DHT11),采集真实数据上报
-
处理平台下发的控制指令(如开关、调节)
-
如需连接 OneNET,注意 Token 生成和 Topic 格式差异
这份文档记录了整个调试过程中的关键节点、错误和解决方案。如果后续需要扩展功能或遇到新问题,可以作为参考。