ESP8266 系列通过 AT 指令接入中国移动新版 OneNET(MQTT)
ESP8266 系列通过 AT 指令接入中国移动 OneNET(MQTT)
本文说明如何使用 ESP8266 系列模组(如 ESP-01、ESP-12F 等)在 AT 固件(需含 MQTT 扩展) 下,通过串口发送 AT 命令连接 OneNET 物联网平台。
1. 硬件与软件前提
|
项目 |
说明 |
|---|---|
|
模组 |
ESP8266 系列,固件需支持 |
|
串口 |
USB 转 TTL(3.3V),TX/RX 与模组交叉连接,共地 |
|
固件下载(安信可) |
直链:1471号 ESP8266系列AT MQTT常规固件V2.2.0。若链接失效,请到 安信可 ESP8266 文档 对应文章末尾查找 1471 号固件 |
|
平台 |
OneNET 已创建产品、添加设备,并记录 产品 ID、设备名称/ID、设备密钥 等 |
|
Token生成工具 |
见onenet官方数据手册 |
|
数据格式 |
若产品选用 OneJSON 物模型,上报/下发的 JSON 需与控制台物模型标识符一致 |
注意:不同批次 AT 固件对 MQTT 子命令可能略有差异,请以当前模组 AT 指令集文档 为准;若指令报错,先确认固件版本是否包含 MQTT 功能。
2. 第一步:设置串口波特率(必读)
在进行任何业务前,建议先把模组 UART 固定为常用速率,避免串口工具与模组速率不一致导致“无响应”或乱码。
推荐命令(9600,8 数据位,1 停止位,无校验,无流控):
AT+UART=9600,8,1,0,0
参数含义(与 ESP8266 AT 文档一致时):
-
9600:波特率 -
8:数据位 -
1:停止位 -
0:校验位(0 = 无校验) -
0:流控(0 = 不使能)
执行后请务必:
-
将串口调试助手 / 上位机串口波特率也改为 9600,再发下一条
AT做回显测试。 -
若先在高波特率下发此命令,改完后立即把助手改为 9600,否则后续指令会失败。
-
需要恢复高速率时,可再发例如
AT+UART=115200,8,1,0,0(以手册为准),并同步修改 PC 端波特率。
3. 基础通信自检
AT
正常应返回 OK。再按需查看版本等信息:
AT+GMR
4. OneNET 控制台准备
在连接模组前,请在 OneNET 完成:
-
创建产品:接入方式选 Wi-Fi,协议选 MQTT,数据格式按项目选(如 OneJSON)。
-
添加设备:记下 产品 ID(product_id)、设备名称(device_name)、设备密钥(auth_info 等)。
-
物模型:定义属性标识符(如
temp),设备上报 JSON 中的字段名需与之一致。
MQTT 连接时,AT+MQTTUSERCFG 里三个字符串通常与 OneNET 约定为:设备名(devicename)、产品 ID(product_id)、Token(token)(见下节);Token 需按平台 token 算法 用设备密钥生成,勿把密钥当密码直接填。
5. Wi-Fi 连接(Station 模式)
示例(请替换为实际 Wi-Fi 名称与密码):
AT+CWMODE=1
AT+CWJAP="你的WiFi名称","你的WiFi密码"
连接成功后,可查询 IP:
AT+CIFSR
6. MQTT 连接 OneNET(示例)
以下 主机、端口、主题 以 OneNET MQTT 接入文档为准;不同版本可能使用 mqtts.heclouds.com、端口 1883(非加密)或 8883(TLS)等,请以控制台显示为准。
6.1 配置 MQTT 用户(示例结构)
固件一般为 AT+MQTTUSERCFG,参数顺序以 你的 AT 手册 为准。对接 OneNET 时,三个引号内的参数通常对应 设备名、产品 ID、Token:
AT+MQTTUSERCFG=0,1,"devicename","product_id","token",0,0,""
|
占位符 |
含义 |
说明 |
|---|---|---|
|
|
设备名称 |
与控制台该设备名称一致,常作为 MQTT client_id |
|
|
产品 ID |
控制台产品详情中的 产品 ID,常作为 MQTT username |
|
|
鉴权 Token |
由 设备密钥 等按 OneNET 文档生成的密码串,作为 MQTT password |
-
首个
0:MQTT 会话编号(以固件说明为准)。 -
若平台或固件对 client_id / username 格式有特殊要求,以 OneNET 当前连接说明 为准。
6.2 建立连接(示例)
AT+MQTTCONN=0,"mqtts.heclouds.com",1883,1
将 "mqtts.heclouds.com"、1883 换成你平台当前提供的 地址与端口。
6.3 物模型(OneJSON 属性上报 / 订阅)
适用于 物模型 / OneJSON 类产品(产品 ID、设备名 替换为控制台真实值):
|
方向 |
Topic |
|---|---|
|
属性上报(设备 → 平台) |
|
|
属性上报回复(订阅,可选) |
|
订阅示例(上报结果回复):
AT+MQTTSUB=0,"$sys/产品ID/设备名/thing/property/post/reply",1
属性上报:使用 AT+MQTTPUBRAW(两步,推荐)
上报 物模型 / OneJSON 时,不要在一行 AT+MQTTPUB 里塞整段 JSON(易超长、转义麻烦)。应先发 RAW 发布指令,再 单独发 payload 正文(字节数须与指令里的长度一致)。
(1)AT 指令(串口调试助手)
先发送(将 产品ID、设备名 换成控制台真实值;第三个数字为下面 JSON 的字节长度,需按实际 payload 计算,下例仅为示意):
AT+MQTTPUBRAW=0,"$sys/产品ID/设备名/thing/property/post",62,0,0
模组返回 > 后,再发送 一行 原始 JSON(无额外 AT 前缀),例如:
{"id":"123","params":{"lux":{"value":1287}}}
具体 JSON 中 id、params 与物模型标识符,以 OneNET OneJSON 文档 与控制台物模型为准。
(2)Arduino 中发送(与 AT 分开写)
-
先用
Serial.print/println发 AT 行(长度数字改成你下面字符串的真实字节数)。 -
等待模组提示可发数据后,再发 JSON 字符串。
-
在 Arduino 源码里若把整段 JSON 写在双引号字符串中,内部双引号需用反斜杠转义,例如:
Serial.println("AT+MQTTPUBRAW=0,\"$sys/产品ID/设备名/thing/property/post\",62,0,0");
// 等待 ">"
Serial.print("{\"id\":\"123\",\"params\":{\"lux\":{\"value\":1287}}}");
单行内嵌完整 JSON 的写法示例(仅示意转义规则):
"{\"id\":\"123\",\"params\":{\"lux\":{\"value\":1287}}}"
6.4 数据流(数据点 dp 上报 / 订阅)
适用于 数据流-数据点 模型(MQTT 物联网套件等文档中的 数据点 topic 簇;{pid} 即产品 ID,{device-name} 即设备名称):
|
方向 |
Topic |
说明 |
|---|---|---|
|
数据点上报(设备 → 平台,发布) |
|
payload 为 JSON,见下 |
|
上传成功通知(订阅) |
|
平台确认写入成功 |
|
上传失败通知(订阅) |
|
解析失败等错误 |
数据点 JSON 正文(dp 内 key 为数据流名称,value 为数据点列表;v 为值,t 为可选 Unix 时间戳秒):
单个数据点示例:
{"id":1,"dp":{"temp":[{"v":25.5}]}}
多个数据点示例:
{
"id": 123,
"dp": {
"temp": [{"v": 22.60}],
"humi": [{"v": 59.40}],
"power": [{"v": 0.95}]
}
}
订阅成功/失败通知示例:
AT+MQTTSUB=0,"$sys/产品ID/设备名/dp/post/json/accepted",1
AT+MQTTSUB=0,"$sys/产品ID/设备名/dp/post/json/rejected",1
数据点上报:使用 AT+MQTTPUBRAW(两步,推荐)
(1)AT 指令
先发送(第三个参数为下面 JSON 的字节长度,须与实际 payload 一致;产品ID、设备名 替换为真实值):
AT+MQTTPUBRAW=0,"$sys/产品ID/设备名/dp/post/json",62,0,0
模组提示 > 后,再发送 原始 JSON,例如:
{"id":123,"dp":{"temperature":[{"v":30,"t":1552289676}]}}
(2)Arduino 中发送
AT 行与 JSON 正文 分两次发送;若把 JSON 写在 C++ 字符串里,双引号需转义,例如:
Serial.println("AT+MQTTPUBRAW=0,\"$sys/5x8jfY031237P/esp/dp/post/json\",62,0,0");
// 等待 ">"
Serial.print("{\"id\":123,\"dp\":{\"temperature\":[{\"v\":30,\"t\":1552289676}]}}");
内嵌于一个字符串常量时的转义示意:
"{\"id\":123,\"dp\":{\"temperature\":[{\"v\":30}]}}"
更完整的字段说明与错误码见 OneNET 文档:数据点 topic 簇。
7. 常见问题
|
现象 |
可能原因 |
|---|---|
|
发 AT 无响应 |
波特率与 |
|
MQTT 连接失败 |
服务器地址/端口错误;未连 Wi-Fi;用户名/密码/Token 过期或格式错误 |
|
上报成功但平台无数据 |
主题错误;JSON 与物模型不符;产品数据格式选错 |
8. 命令顺序小结
-
AT+UART=9600,8,1,0,0→ 电脑串口改为 9600 -
AT自检 -
AT+CWMODE=1→AT+CWJAP=... -
AT+MQTTUSERCFG=0,1,"devicename","product_id","token",0,0,""→AT+MQTTCONN=... -
按产品类型选择 物模型(
.../thing/property/...)或 数据流(.../dp/post/json...)的AT+MQTTSUB;上报正文建议用AT+MQTTPUBRAW:先发带 payload 长度 的 AT 行,再发 JSON(Arduino 与 AT 分开展示,字符串内双引号需\"转义)
更详细的属性下发、事件上报等,请结合 OneNET 官方文档 查阅。
文档仅供学习参考,请以模组 AT 手册与 OneNET 当前平台说明为准。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)