ESP8266 系列通过 AT 指令接入中国移动 OneNET(MQTT)

本文说明如何使用 ESP8266 系列模组(如 ESP-01、ESP-12F 等)在 AT 固件(需含 MQTT 扩展) 下,通过串口发送 AT 命令连接 OneNET 物联网平台。


1. 硬件与软件前提

项目

说明

模组

ESP8266 系列,固件需支持 AT+MQTT* 等 MQTT 相关指令

串口

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 = 不使能)

执行后请务必:

  1. 将串口调试助手 / 上位机串口波特率也改为 9600,再发下一条 AT 做回显测试。

  2. 若先在高波特率下发此命令,改完后立即把助手改为 9600,否则后续指令会失败。

  3. 需要恢复高速率时,可再发例如 AT+UART=115200,8,1,0,0(以手册为准),并同步修改 PC 端波特率。


3. 基础通信自检

AT

正常应返回 OK。再按需查看版本等信息:

AT+GMR

4. OneNET 控制台准备

在连接模组前,请在 OneNET 完成:

  1. 创建产品:接入方式选 Wi-Fi,协议选 MQTT,数据格式按项目选(如 OneJSON)。

  2. 添加设备:记下 产品 ID(product_id)设备名称(device_name)设备密钥(auth_info 等)

  3. 物模型:定义属性标识符(如 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,""

占位符

含义

说明

devicename

设备名称

与控制台该设备名称一致,常作为 MQTT client_id

product_id

产品 ID

控制台产品详情中的 产品 ID,常作为 MQTT username

token

鉴权 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

属性上报(设备 → 平台)

$sys/{product_id}/{device_name}/thing/property/post

属性上报回复(订阅,可选)

$sys/{product_id}/{device_name}/thing/property/post/reply

订阅示例(上报结果回复):

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 中 idparams 与物模型标识符,以 OneNET OneJSON 文档 与控制台物模型为准。

(2)Arduino 中发送(与 AT 分开写)

  • 先用 Serial.print/printlnAT 行(长度数字改成你下面字符串的真实字节数)。

  • 等待模组提示可发数据后,再发 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

说明

数据点上报(设备 → 平台,发布

$sys/{pid}/{device-name}/dp/post/json

payload 为 JSON,见下

上传成功通知(订阅

$sys/{pid}/{device-name}/dp/post/json/accepted

平台确认写入成功

上传失败通知(订阅

$sys/{pid}/{device-name}/dp/post/json/rejected

解析失败等错误

数据点 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 无响应

波特率与 AT+UART 不一致;接线 TX/RX 未交叉;供电不足

MQTT 连接失败

服务器地址/端口错误;未连 Wi-Fi;用户名/密码/Token 过期或格式错误

上报成功但平台无数据

主题错误;JSON 与物模型不符;产品数据格式选错


8. 命令顺序小结

  1. AT+UART=9600,8,1,0,0电脑串口改为 9600

  2. AT 自检

  3. AT+CWMODE=1AT+CWJAP=...

  4. AT+MQTTUSERCFG=0,1,"devicename","product_id","token",0,0,""AT+MQTTCONN=...

  5. 按产品类型选择 物模型.../thing/property/...)或 数据流.../dp/post/json...)的 AT+MQTTSUB;上报正文建议用 AT+MQTTPUBRAW:先发带 payload 长度 的 AT 行,再发 JSON(Arduino 与 AT 分开展示,字符串内双引号需 \" 转义)

更详细的属性下发、事件上报等,请结合  OneNET 官方文档  查阅。


文档仅供学习参考,请以模组 AT 手册与 OneNET 当前平台说明为准。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐