赞
踩
单片机:STM32F103c8t6
EMQX:自身服务器上搭载emq服务器或者借用emqx window 版本
USB TO TTL模块:CH340
因为CH340不能给ESP-01s供3.3V的电,所以测试时需要外加供电
本章中涉及到的技术原理主要为ESP01S wfi模块的AT指令通信,我在上一篇文章给大家提到了ESP01S AT指令的使用,大家可以先通过我的上一篇文章入门。
STM32+ESP-01s+EMQX实现单片机MQTT协议传输数据上云(一)ESP-01s的AP-MQTT bin文件安装以及指令使用_JASON丶LI的博客-CSDN博客
如果大家嫌我啰嗦,也可以直接去看乐鑫公司AT指令集合,链接我也放下面了
AT 命令集 - ESP32 - — ESP-AT 用户指南 latest 文档 (espressif.com)
连接:首先通过STM32的Usart通信给ESP01S(下面简称ESP)模块发送相关指令,开启ESP模块的Station(客户端模式),在进行配网模式,连接进入STM32设定好的WIFI信息,然后定义ESP的MQTT属性,最后连接进入STM32设定好的MQTT服务器。
发送指令:STM32发送指令到ESP使其向对应topic发送任意QOS等级的Message
接收指令:STM32发送指令到ESP使其订阅定义的topic,在指令接收发送方面,采用Usart接收文本数据包的形式。由于MQTT下发的通知默认格式为 '+' 为开头换行符( '/r/n' )为结尾的,所以如下图所示以 '+' 为数据的接收提取标志位,换行符作为接收标志位。
ESP-01s | STM32 |
TXD | RXD |
RXD | TXD |
3.3v | 3.3v |
GND | GND |
STM32 连网+连服务器 AT指令:
- //ESP模块初始化
- Serial_SendString("AT+RST\r\n");
- Delay_s(1);
-
- //ESP模块设置为Station模式
- Serial_SendString("AT+CWMODE=1\r\n");
- Delay_s(1);
-
- //ESP模块连接进入WIFI(ID:JASON; PASSWORD:88888888)
- Serial_SendString("AT+CWJAP=\"JASON\",\"88888888\"\r\n");
- Delay_s(1);
-
- //设定ESP模块MQTT属性(服务器ID:JASON123456car; ID:JASON; PASSWORD:123)
- Serial_SendString("AT+MQTTUSERCFG=0,1,\"JASON123456car\",\"JASON\",\"123\",0,0,\"\"\r\n");
- Delay_s(1);
-
- //ESP模块连接MQTT服务器(服务器域名:123.0.0.1; 服务器端口:1883)
- Serial_SendString("AT+MQTTCONN=0,\"127.0.0.1\",1883,0\r\n");
- Delay_s(1);
STM32 订阅服务器端口 AT指令:
- //ESP订阅TOESP01S端口
- Serial_SendString("AT+MQTTSUB=0,\"TOESP01S\",0\r\n");
STM32 发送指令到服务器端口 AT指令:
- //不带参:向FROMESP01S端口发送STM_OK信息 消息服务等级QOS为;0
- Serial_SendString("AT+MQTTPUB=0,\"FROMESP01S\",\"STM_OK\",0,0\r\n");
-
- //带参:向FROMESP01S端口发送信息i 消息服务等级QOS为;0
- printf("AT+MQTTPUB=0,\"FROMESP01S\",\"Num=%d\",0,0\r\n",i)
STM接收订阅的服务器端口的指令信息
- if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
- {
- uint8_t RxData = USART_ReceiveData(USART1);
-
- if (RxStare == 0) //状态1
- {
- if (RxData == '+' && Serial_RxFlag == 0)
- {
- RxStare = 1;
- pRxPacket = 0;
- }
-
- }
- else if (RxStare == 1) //状态2
- {
- if (RxData == '\r')
- {
- RxStare =2;
- }
- else
- {
- Serial_RxPacket[pRxPacket] = RxData;
- pRxPacket ++;
- }
-
- }
- else if (RxStare == 2) //状态3
- {
- if (RxData == '\n')
- {
- RxStare = 0;
- Serial_RxPacket[pRxPacket] = '\0';
- Serial_RxFlag = 1;
- }
- }
- USART_ClearITPendingBit(USART1, USART_FLAG_RXNE);
- }
STM32C8T6-learning-project: STM32 project (gitee.com)
点赞后,发表评论后评论区即可领取解压密码,作者24小时冲浪,秒回!
本文为作者独立编写
本BLOG上所有的原创文章未经本人许可,不得用于商业用途及传统媒体。网络媒体转载请注明出处,否则属于侵权行为。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。