上一篇是理论与流程梳理,这一篇是实操。
一 阿里云配置
点击进入阿里云平台官网,登录帐号,找到"物联网平台",点进去然后点击管理控制台第一次用会让你开通物联网平台,然后点击开通,进去之后点击 同意协议,然后点击立即开通。
(我是之前就开通的,现在开通不知道是否需要付费)点击"公共实例",找到"设备管理" ---点击"产品"--"创建产品"




点击"产品" "查看" 我们刚刚创建的 "测试a",点击Topic类列表,点击"自定义Topic",然后点击"定义Topic主题"


二 上云
- 回到设备页面,可以看到设备的主题已经有了刚刚自定义定义的topic,权限是可订阅与可发布。
- 在创建完成后,可以通过MQTT软件来测试一下能否正常连接,在这一步之前必须已在物联网平台控制台中创建产品和设备,并获取设备证书信息(ProductKey、DeviceName和DeviceSerect)。
- 先打开"阿里云物联平台配置_32.exe"工具,按下图填写,工具会自动计算链接阿里云的必要参数。

还记得我们上一篇文章吗,我们使用AT指令配置esp8266设备上云。
先将wifi设置成sta模式,连接到WiFi网络。
cpp
AT+CWMODE=1 //设置 WiFi为STA模式
AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"
//配置 SNTP 网络时间同步,阿里云 MQTT 登录签名强依赖时间戳,模块本地时间不准会直接鉴权失败、连不上服务器。开启时间同步保证设备时间和阿里云服务器一致。
//第 1 位 1:开启 SNTP 时间同步(0 = 关闭)
//第 2 位 8:时区 UTC+8(北京时间,国内固定填 8)
//第 3 位 "ntp1.aliyun.com":阿里云 NTP 时间服务器地址
AT+CWJAP="WiFi名","WiFi密码"
AT+MQTTUSERCFG=0,1,"NULL","用户名","密码",0,0,"" //作用:给模块配置登录阿里云 MQTT 服务器的账号密码,是鉴权关键。
//1.LinkID:ESP8266 MQTT 连接通道编号,模块默认只支持 1 路 MQTT,固定填 0。
//2.clean_session:清除会话标识:1= 断连后清空会话、离线消息;家用 / 测试场景固定填 1。
//3."NULL":MQTT 协议层面的客户端名称,阿里云直连模式下此字段无用,统一填 NULL。
//4."用户名":阿里云 MQTT 生成的 Username(工具算出的那串账号,必填,不能乱填)
//5."密码": 阿里云 MQTT 签名后的 Password(工具算出的加密密码,核心鉴权字段)
//6.will_flag:关闭遗嘱消息(设备离线上报消息,测试可关闭)
//7.will_qos:遗嘱消息 QoS 等级,关闭遗嘱时无效
//8."":遗嘱主题,关闭遗嘱时填空字符串
//举例:AT+MQTTUSERCFG=0,1,"NULL","LIGHT1&k1morxU8ru9","84BA3F1D24D6D5691459A1E3D8071CDB2B1EF6ED",0,0,""
//工具计算的"Username"和"Password",,按格式改动即可
AT+MQTTCLIENTID=0,"ClienId"//设置 MQTT ClientID(客户端唯一 ID)
//1.LinkID = 0:和上面保持一致,MQTT 通道 0
//2."ClienId":阿里云规则拼接后的完整 ClientID,阿里云标准 ClientID 格式示例:设备名|securemode=3\,signmethod=hmacsha1\,timestamp=xxx|clientId第二个参数注意每个逗号后加分隔符"\",例如:t|securemode=3\,signmethod=hmacsha1\,
//举例:AT+MQTTCLIENTID=0,"123456MA|securemode=3\,signmethod=hmacsha1\,timestamp=1780062000|"
//工具计算的"ClientId",按格式改动即可
AT+MQTTCONN=0,"a1Py84SEWWJ.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1 //到这一步:云端设备状态会从「未激活」变为「在线 / 已激活」
//0. 0:MQTT 通道 ID
//1. "a1Py84SEWWJ.iot-as-mqtt.cn-shanghai.aliyuncs.com":阿里云MQTT服务器域名(从工具复制)
//2. 1883:端口号,1883 = 普通 TCP 直连(你当前使用的模式),8883 = TLS 加密端口
//3. 1:reconn=1 → 开启自动重连,网络断开后模块自动重试连接服务器。
//举例:AT+MQTTCONN=0,"k1morxU8ru9.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1
//工具计算的"连接域名",按格式改动即可
AT+MQTTSUB=0,"订阅的主题",1 //订阅的主题可在云端设备的"自定义Topic列表"复制进去
//1. MQTT 通道 ID
//2. "订阅的主题":阿里云平台自定义 Topic / 设备默认 Topic(必须和云端完全一致,建议复制)
//3. QoS 消息等级(0/1/2,测试常用 0 或 1)
//举例:AT+MQTTSUB=0,"/k1morxU8ru9/测试a/user/topicTest",1
//将Topic的设备名,如"测试a"替换成自己的即可。
三 测试
然后再找到"设备LIGHT1",点击--LIGHT1--查看


发布消息:ni hao 2026

串口收到相应数据

那么我们想设备上报数据(发布)到云,可以
cpp
AT+MQTTPUB=0,"/k1morxU8ru9/LIGHT1/user/topicTest","2026test",0,0
可以看到



可以在阿里云的日志服务中看到,设备到云的信息 和 云到设备的信息 都是2026test,这是因为我们的主题是订阅与发布,因此串口中接收了两次。实际使用中可以分开,做到上传和下发走不同的通道。
这里放一下完整的串口数据
cpp
[14:15:28.079]发→◇AT+CWMODE=1
□
[14:15:28.084]收←◆AT+CWMODE=1
OK
[14:15:38.462]发→◇AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"
□
[14:15:38.470]收←◆AT+CIPSNTPCFG=1,8,"ntp1.aliyun.com"
OK
[14:15:53.183]发→◇AT+CWJAP="你的wifi名","你的wifi密码"
□
[14:15:53.190]收←◆AT+CWJAP="你的wifi名","你的wifi密码"
WIFI DISCONNECT
[14:15:54.536]收←◆WIFI CONNECTED
[14:15:55.193]收←◆WIFI GOT IP
OK
[14:16:12.956]发→◇AT+MQTTUSERCFG=0,1,"NULL","LIGHT1&k1morxU8ru9","84BA3F1D24D6D5691459A1E3D8071CDB2B1EF6ED",0,0,""
□
[14:16:12.963]收←◆AT+MQTTUSERCFG=0,1,"NULL","LIGHT1&k1morxU8ru9","84BA3F1D24D6D5691459A1E3D8071CDB2B1EF6ED",0,0,""
OK
[14:20:37.689]发→◇AT+MQTTCLIENTID=0,"123456MA|securemode=3\,signmethod=hmacsha1\,timestamp=1780062000|"
□
[14:20:37.698]收←◆AT+MQTTCLIENTID=0,"123456MA|securemode=3\,signmethod=hmacsha1\,timestamp=1780062000|"
OK
[14:30:12.777]发→◇AT+MQTTCONN=0,"k1morxU8ru9.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1
□
[14:30:12.786]收←◆AT+MQTTCONN=0,"k1morxU8ru9.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883,1
[14:30:15.360]收←◆+MQTTCONNECTED:0,1,"k1morxU8ru9.iot-as-mqtt.cn-shanghai.aliyuncs.com","1883","",1
OK
[14:33:05.247]发→◇AT+MQTTSUB=0,"/k1morxU8ru9/测试a/user/topicTest",1
□
[14:33:05.255]收←◆AT+MQTTSUB=0,"/k1morxU8ru9/测试a/user/topicTest",1
[14:33:05.293]收←◆
OK
[14:38:07.000]收←◆+MQTTSUBRECV:0,"/k1morxU8ru9/LIGHT1/user/topicTest",12,ni hao 2026
[15:05:47.136]发→◇AT+MQTTPUB=0,"/k1morxU8ru9/LIGHT1/user/topicTest","2026test",0,0
OK
□
[15:05:47.144]收←◆AT+MQTTPUB=0,"/k1morxU8ru9/LIGHT1/user/topicTest","2026test",0,0
busy p...
OK
[15:05:47.494]收←◆+MQTTSUBRECV:0,"/k1morxU8ru9/LIGHT1/user/topicTest",8,2026test