1. 前言

在上一次的实验里,我们借助电脑软件mqttx的帮助,成功地与OneNet平台上的设备建立了MQTT协议连接。不仅模拟发送了温湿度数据,还接收到了控制LED1的指令。这次,我们将使用硬件模块ESP8266再次实现同样的目标。相信这将是一次既有趣又能学到新知识的经历!

2. 获取资料

扫描下方二维码加入嵌入式技术交流群,即可获取源码压缩包,群内有更多相关资料,并同步答疑驱动开发、移植问题及后续版本更新,同时有更多嵌入式问题也欢迎讨论~ 181-921-938

3. 硬件准备

3.1. 联芯物联网开发板-LX-IOT-F103

本教程原文都将使用此开发板进行展示,关于开发板详细请浏览:

此处为语雀内容卡片:https://www.yuque.com/u54102073/mol0bc/wa9y5yt2qfvip1mh

优点:

  • 板载DAP-Link烧录器+虚拟串口:实现一根USB Typec线烧录+串口打印,无需多调试器与杜邦线连接。
  • 板载ESP8266+拨码开关:只需要将拨码开关的DAP串口与ESP8266串口连接,即可实现在电脑串口调试软件中实现直接与ESP8266通信,减少杜邦线连接与降低因杜邦线产生的问题概率。
  • 板载多执行器与传感器,能够作为学习,方案快速验证板。

3.2. 或自行购买硬件

无需额外配件,准备以下 4 款工具即可完成全部功能:

  1. STM32F103C8T6 最小系统板
  2. ESP-01S / 直插引脚版 ESP8266-12F
  3. CH340 串口调试工具
  4. ST-Link 烧录工具

4. wifi烧录固件

4.1. 进入烧录下载模式 (关键步骤)

分两种硬件场景,操作略有区别,看到 WiFi 蓝灯单次闪烁 = 成功进入模式

  • 联芯开发板烧录wifi固件

用杜邦线或镊子短接板载 WiFi 的两个烧录焊盘 → 按下 WiFi 复位键 → 蓝灯闪烁后松开短接工具即可。

  • 自行购买的模块烧录固件

将 GPIO0 引脚与 GND 短接(拉低电平)→ 重新给模块上电 / 短接 RST 复位引脚后松开 → 蓝灯单次闪烁即完成。

4.2. 串口连线 (电脑 与 ESP8266)

  • 联芯开发板烧录wifi 与 电脑串口连线

调整串口拨码开关:最上方 2 位拨到右侧(导通),下方 4 位拨到左侧(断开)。

  • 自行购买的模块 与 电脑串口连线

严格交叉连接:WiFi 的 RX 引脚 ↔ 串口工具 TX 引脚;WiFi 的 TX 引脚 ↔ 串口工具 RX 引脚。

4.3. 烧录固件

  1. 打开官方 ESP8266 固件烧录软件,芯片型号选择ESP8266

  1. 固件选择:1471 号 AT 固件(兼容 1MB Flash 的 ESP-01S、4MB Flash 的 ESP8266-12F,通用无兼容问题);
  2. 参数设置:烧录地址填0,选择电脑识别的串口号,波特率固定115200(稳定性最佳);
  3. 点击开始进行烧录;若长时间无反应,重新进入烧录模式,并检查 RX/TX 接线、拨码开关。

4.4. 烧录成功验证

  1. 烧录完成后点击停止,关闭烧录软件;
  2. 打开串口调试助手,波特率设置为115200
  3. 取消 GPIO0 短接,给 ESP8266 复位 / 重新上电;
  4. 查看串口打印:输出信息与教程图示一致(核对固件版本号、编译时间),即为烧录成功;
  5. 功能测试:串口发送指令AT必须加回车换行),模块返回OK,说明 AT 指令功能正常。

5. 基础AT指令

这里放一个乐鑫官方的AT指令手册:AT 命令集 - ESP32 - — ESP-AT 用户指南 latest 文档

烧录的固件默认波特是115200,数据位:8,校验位:无,停止位:1。

这里我是用微软商店下载的《串口调试助手》软件,免费使用基础功能,当然用其他的串口软件也可以。

串口如下图配置,还有下面的勾选:“显示发送字符串”,方便查看我们发送的数据是否有被模组响应。

5.1. AT:测试 AT 启动

指令

响应

功能

AT

OK

测试模组是否处于工作状态

5.2. AT+RST:重启模块

指令

响应

功能

AT+RST

OK

软件复位,恢复所有运行状态

5.3. AT+RESTORE:恢复出厂设置

指令

响应

功能

AT+RESTORE

OK

恢复所有参数为默认值,并重启

主要用于系统第一次运行时候,清空所有参数。

5.4. ATE:开启或关闭 AT 回显功能

指令

响应

功能

ATE1

OK

打开回显

ATE0

OK

关闭回显

ATE1:开启回显后,使用串口助手发送AT指令,模组会返回AT指令和响应。

ATE0:关闭回显后,使用串口助手发送AT指令,模组只会返回响应。

这个功能不会保存进flash中,复位后效果消失,默认开启回显,所以需要在复位指令后使用。

5.5. 执行效果图

发送指令时,注意要在后面加上换行回车,按下键盘回车即可。

发送效果

①:AT,接收到:回显的"AT",和响应的“OK”数据,说明模组和通信正常。

②:AT+RST复位,接收到:回显的"AT+RST",和响应的“OK”数据,以及后面的模组初始化运行Log。

③:ATE0关闭回显,接收到:回显的"ATE0",和响应的“OK”数据。

④:再次发送AT,只有响应的“OK”数据,刚刚发送的回显指令生效。

6. wifi指令

6.1. AT+CWMODE:查询/设置 Wi-Fi 模式

指令

响应

功能

AT+CWMODE=1

OK

设置Wi-Fi为Station模式连接热点

6.2. AT+CWJAP:连接 AP

指令

响应

功能

AT+CWJAP="iqoo123","12345678"

WIFI CONNECTED
WIFI GOT IP

OK

连接2.4GHz wifi

这里修改成自己的wifi账号与密码。

注意:连接的wifi必须是2.4GHz,否则无法连接。

如果返回其他错误,确保wifi账号密码正确,以及频段是2.4GHz的,建议电源可支持峰值电流500mA以上。

6.3. AT+CWSTATE:查询 Wi-Fi 状态和 Wi-Fi 信息

指令

响应

功能

AT+CWSTATE?

+CWSTATE:<state>,<"ssid">

OK

查询当前wifi连接状况

在后续的单片机程序中,通过此指令state字段是否为2,来判断wifi是否成功连接。

参数

  • <state>:当前 Wi-Fi 状态
    • 0: ESP32 station 尚未进行任何 Wi-Fi 连接
    • 1: ESP32 station 已经连接上 AP,但尚未获取到 IPv4 地址
    • 2: ESP32 station 已经连接上 AP,并已经获取到 IPv4 地址
    • 3: ESP32 station 正在进行 Wi-Fi 连接或 Wi-Fi 重连
    • 4: ESP32 station 处于 Wi-Fi 断开状态
  • <”ssid”>:目标 AP 的 SSID

6.4. 执行效果图

发送指令时,注意要在后面加上换行回车,按下键盘回车即可。

①:设置Station模式。

②:连接2.4GHz wifi。

③:查询当前wifi信息,可以看到state字段是2,说明连接成功。

7. mqtt指令

7.1. AT+MQTTUSERCFG:设置 MQTT 用户属性

指令

响应

功能

AT+MQTTUSERCFG=0,1,"dev-001","0g8ZhlAicM","version=2018-10-31&res=products%2F0g8ZhlAicM%2Fdevices%2Fdev-001&et=1797745146&method=md5&sign=jnvluASkhbMOSiBouw7ZOg%3D%3D",0,0,""

OK

配置MQTT参数

  • <”client_id”>:MQTT 客户端 ID,最大长度:256 字节。替换自己的“设备名称”。
  • <”username”>:用户名,用于登陆 MQTT broker,最大长度:64 字节。替换自己的“产品ID”。
  • <”password”>:密码,用于登陆 MQTT broker,最大长度:64 字节。替换自己的“鉴权Token”。
  • 其他参数默认。

这里有个值得注意的地方:

这里不知道是文档写错了还是啥原因,我的password长度大于64字节,还是可以正常设置,而且client_id长度一般比password长度短,感觉是这里的长度写反了。

7.2. AT+MQTTCONN:连接 MQTT Broker

指令

响应

功能

AT+MQTTCONN=0,"mqtts.heclouds.com",1883,1

OK

连接MQTT服务器

  • <”host”>:MQTT broker 域名,最大长度:128 字节。替换OneNET MQTT域名:"mqtts.heclouds.com"。
  • <port>:MQTT broker 端口,最大端口:65535。替换OneNET MQTT端口:1883

7.3. AT+MQTTCONN?:查询 MQTT Broker

指令

响应

功能

AT+MQTTCONN?

+MQTTCONN:<LinkID>,<state>,<scheme>,<"host">,<port>,<"path">,<reconnect>
OK

查询连接MQTT信息与状态

在后续的单片机程序中,通过此指令state字段是否为6,来判断mqtt是否连接成功并订阅了主题。

7.4. AT+MQTTSUB:订阅 MQTT Topic

指令

响应

功能

AT+MQTTSUB=0,"$sys/0g8ZhlAicM/dev-001/thing/property/post/reply",0

OK

订阅“设备属性上报响应”主题

AT+MQTTSUB=0,"$sys/0g8ZhlAicM/dev-001/thing/property/set",0

OK

订阅“设备属性设置请求”主题

  • <”topic”>:订阅的 topic。替换自己的“产品ID”与“设备名称”。

这里实现订阅“设备属性上报响应”主题,是为了接收上报数据的响应,来判断数据是否成功上报。

这里实现订阅“设备属性设置请求”主题,是为了接收平台下行的数据,来根据数据中的指令来执行对应的操作。

7.5. 执行效果图

发送指令时,注意要在后面加上换行回车,按下键盘回车即可。

①:设置MQTT属性,注意填写自己的信息。

②:连接MQTT服务器,填写自己的信息,如果显示断开连接,那么就是信息不对。

③:获取MQTT状态,第二个参数是state参数,4代表连接成功,但是还没订阅主题。

④:订阅“设备属性上报响应”主题,这里如果主题内容是错的,那么OneNET那边会主动断开MQTT连接。

⑤:订阅“设备属性设置请求”主题,这里如果主题内容是错的,那么OneNET那边会主动断开MQTT连接。

⑥:再次获取MQTT状态,第二个参数是state参数,6代表连接成功,并且成功订阅了主题。

8. 上行数据

这里上报模拟温湿度数据到OneNET上。

8.1. AT+MQTTPUBRAW:发布长 MQTT 消息

需要“发送的字符串长度”可以使用这个在线字符串计数网站:字符计数器:计算字符数

注意在“数据模式”下发送数据可以不用加换行回车符。

统计好字符串长度后,填写长度参数。

指令

响应

功能

AT+MQTTPUBRAW=0,"$sys/0g8ZhlAicM/dev-001/thing/property/post",115,0,0
OK
>

进入数据模式,发送指定长度到“设备属性上报请求”主题之后自动退出

{"id":"123","params":{"CurrentTemperature":{"value":18.7},"CurrentHumidity":{"value":20.4},"LED1":{"value":false}}}

+MQTTPUB:OK

发送数据

订阅了主题的情况下还会接收到“设备属性上报响应”主题的数据:

+MQTTSUBRECV:0,"$sys/0g8ZhlAicM/dev-001/thing/property/post/reply",39,{"id":"123","code":200,"msg":"success"}

8.2. 执行效果图

将上方的指令依次发送:

①:发布长数据,这里发布115字节的数据到“设备属性上报请求”主题。

②:发送115字节数据,之后自动退出。

③:由于前面订阅了“设备属性上报响应”主题,上报数据后,会接收到响应内容,可以看到msg是success,说明上报数据成功。

9. 下行数据

这里接收OneNET下行的数据,例如"LED1":false指令。

9.1. OneNET API调试

这里进行API调试,填写自己的产品ID,设备名称,
params填写:

{
  "LED1": true
}

然后点击执行。

9.2. 串口接收到数据

这里接收到数据:

+MQTTSUBRECV:0,"$sys/0g8ZhlAicM/dev-001/thing/property/set",50,{"id":"17","version":"1.0","params":{"LED1":true}}

可以看到里面有{"LED1":true},后续单片机程序就解析里面的标识符"LED1"和"true"数值,来进行对应的操作,例如这里对应的“开灯”。

9.3. 响应

我们刚刚只是纯接收数据,并没有进行响应数据,所以OneNET这边显示“设备响应超时”,所以我们需要在接收到数据5s内进行数据回应

通过我们之前使用MQTTX软件,知道了响应的方法与主题。

这里的发送数据的id,需要和接收到数据的id保持一致,例如接收到的数据,里面的json数据的id是"17":

+MQTTSUBRECV:0,"$sys/0g8ZhlAicM/dev-001/thing/property/set",50,
{
  "id":"17",
  "version":"1.0",
  "params":{
    "LED1":true
  }
}

那么等会回应的数据,里面的id也要是"17",每次执行一次属性设置后,id会自增1:

{
  "id":"17",
  "code":200,
  "msg":"user_succ"
}

这里还是需要计算 需要发送字符串的长度:字符计数器:计算字符数

注意在数据模式下发送数据可以不用加换行回车符。

指令

响应

功能

AT+MQTTPUBRAW=0,"$sys/0g8ZhlAicM/dev-001/thing/property/set_reply",40,0,0
OK
>

进入数据模式,发送指定长度到“设备属性设置响应”主题之后自动退出

{"id":"23","code":200,"msg":"user_succ"}

+MQTTPUB:OK

发送数据

再次在OneNET API进行一次执行操作,这里需要快速发送两次AT指令,建议先提前预判一下消息id号,等收到数后快速粘贴到发送框发送,时间不超过5s。

9.4. 执行效果图

在接收OneNET的下行数据后,依次将上面的指令发送:

①:接收到:“设备属性设置请求”主题的数据,这里面id是:25

②:进入长数据模式,注意计算需要发送字符的长度

③:回应数据,里面的id需要和①的id一致,例如都是25

④:在OneNET API调试页面,可以看到显示成功。

10. 总结

在本章节中,我们通过AT指令成功建立了与OneNET MQTT服务器的连接,并实现了数据的上行和下行通信。具体而言,我们上传了模拟的温湿度数据,并接收到了用于控制LED灯状态的指令。接下来,在下一章节里,我们将探讨如何利用单片机的串行接口自动发送和接收这些数据,从而取代之前手动操作的过程。下一阶段的主要任务是将该程序移植到单片机上,并根据个人需求调整OneNET配置信息(如WiFi网络参数等)以及设备属性设置,以确保系统能够正常运行。

Logo

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

更多推荐