打印
[应用相关]

STM32通过ESP8266连接MQTT服务器

[复制链接]
28|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2025-1-21 10:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、引言
在物联网(IoT)蓬勃发展的时代,设备之间的互联互通至关重要。STM32 作为一款广泛应用的 32 位微控制器,具备强大的处理能力和丰富的外设接口。ESP8266 是一款低成本的 Wi-Fi 模块,能为 STM32 提供无线网络连接功能。MQTT 作为一种轻量级的消息传输协议,适用于物联网设备之间的通信。本文将详细介绍如何实现 STM32 通过 ESP8266 连接 MQTT 服务器,构建一个物联网通信节点。

二、相关技术概述
(一)STM32
STM32 是意法半导体推出的基于 ARM Cortex - M 内核的微控制器系列,具有高性能、低功耗、丰富的外设(如 USART、SPI、I2C 等)等特点。其强大的处理能力能够满足各种复杂的应用需求,在工业控制、智能家居、环境监测等领域广泛应用。

(二)ESP8266
ESP8266 是乐鑫科技开发的一款高度集成的 Wi-Fi 模块,支持 STA(Station)、AP(Access Point)和 STA + AP 三种工作模式。它通过串口与外部设备通信,能够轻松实现设备的无线网络连接,为物联网设备提供便捷的上网途径。

(三)MQTT 协议
MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅模式的轻量级消息传输协议。它具有占用带宽小、支持低带宽及不稳定网络等特点,非常适合物联网设备之间的通信。MQTT 通信涉及三个主要角色:发布者(Publisher)、订阅者(Subscriber)和代理服务器(Broker)。发布者将消息发布到特定主题(Topic),代理服务器负责接收并转发这些消息给订阅了相应主题的订阅者。

三、硬件连接
(一)STM32 与 ESP8266 连接
串口连接:
ESP8266 的 TX 引脚连接到 STM32 的 USART 接收引脚(如 PA10)。
ESP8266 的 RX 引脚连接到 STM32 的 USART 发送引脚(如 PA9)。
电源连接:
ESP8266 的 VCC 引脚连接到 3.3V 电源。
ESP8266 的 GND 引脚接地。
复位引脚:
ESP8266 的 RST 引脚可连接到 STM32 的一个 GPIO 引脚(如 PA8),用于复位 ESP8266。
(二)其他连接
为确保系统稳定运行,可在 ESP8266 的电源引脚附近连接一个 10μF 的电解电容和一个 0.1μF 的陶瓷电容进行滤波。

四、软件设计
(一)ESP8266 初始化
通过串口向 ESP8266 发送 AT 指令进行初始化配置,使其进入 STA 模式并连接到指定的 Wi-Fi 网络。以下是基于 STM32 HAL 库的 ESP8266 初始化代码示例:

#include "stm32f10x.h"
#include "stdio.h"
#include "string.h"

#define ESP8266_USART USART1
#define ESP8266_GPIO_PORT GPIOA
#define ESP8266_TX_PIN GPIO_PIN_9
#define ESP8266_RX_PIN GPIO_PIN_10
#define ESP8266_RST_PIN GPIO_PIN_8

void USART_Init(void);
void ESP8266_Init(void);
void Send_AT_Command(const char *command, const char *response, uint32_t timeout);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

UART_HandleTypeDef huart1;
char esp8266_response[256];
volatile uint8_t response_received = 0;

void USART_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct;
    huart1.Instance = ESP8266_USART;
    huart1.Init.BaudRate = 115200;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    HAL_UART_Init(&huart1);

    // 配置 USART 引脚
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = ESP8266_TX_PIN | ESP8266_RX_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ESP8266_GPIO_PORT, &GPIO_InitStruct);
}

void ESP8266_Init(void) {
    // 复位 ESP8266
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.Pin = ESP8266_RST_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(ESP8266_GPIO_PORT, &GPIO_InitStruct);
    HAL_GPIO_WritePin(ESP8266_GPIO_PORT, ESP8266_RST_PIN, GPIO_PIN_RESET);
    HAL_Delay(100);
    HAL_GPIO_WritePin(ESP8266_GPIO_PORT, ESP8266_RST_PIN, GPIO_PIN_SET);
    HAL_Delay(100);

    // 测试 AT 指令
    Send_AT_Command("AT\r\n", "OK", 1000);

    // 设置为 STA 模式
    Send_AT_Command("AT+CWMODE=1\r\n", "OK", 1000);

    // 连接 Wi-Fi
    char wifi_command[50];
    sprintf(wifi_command, "AT+CWJAP=\"your_SSID\",\"your_PASSWORD\"\r\n");
    Send_AT_Command(wifi_command, "OK", 5000);
}

void Send_AT_Command(const char *command, const char *response, uint32_t timeout) {
    response_received = 0;
    memset(esp8266_response, 0, sizeof(esp8266_response));
    HAL_UART_Transmit(&huart1, (uint8_t *)command, strlen(command), 1000);
    HAL_UART_Receive_IT(&huart1, (uint8_t *)esp8266_response, sizeof(esp8266_response));
    uint32_t tickstart = HAL_GetTick();
    while ((!response_received) && ((HAL_GetTick() - tickstart) < timeout)) {
    }
    if (strstr(esp8266_response, response)!= NULL) {
        // 响应成功处理
    } else {
        // 响应失败处理
    }
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart == &huart1) {
        response_received = 1;
    }
}



(二)MQTT 连接与通信
使用 ESP8266 的 MQTT 透传功能,通过串口向其发送 MQTT 连接指令、订阅主题指令以及发布消息指令。以下是相关代码示例:

void MQTT_Connect(void) {
    char mqtt_connect_command[100];
    sprintf(mqtt_connect_command, "AT+MQTTCLIENTCONNECT=0,\"your_MQTT_server_IP\",\"1883\",\"your_client_ID\",\"your_username\",\"your_password\"\r\n");
    Send_AT_Command(mqtt_connect_command, "OK", 3000);
}

void MQTT_Subscribe(const char *topic) {
    char subscribe_command[100];
    sprintf(subscribe_command, "AT+MQTTSUBSCRIBE=0,0,\"%s\"\r\n", topic);
    Send_AT_Command(subscribe_command, "OK", 2000);
}

void MQTT_Publish(const char *topic, const char *message) {
    char publish_command[200];
    sprintf(publish_command, "AT+MQTTPUBLISH=0,\"%s\",0,0,\"%s\"\r\n", topic, message);
    Send_AT_Command(publish_command, "OK", 2000);
}



(三)主函数
在主函数中调用上述初始化和通信函数,实现 STM32 通过 ESP8266 连接 MQTT 服务器,并进行消息的订阅和发布。

int main(void) {
    USART_Init();
    ESP8266_Init();
    MQTT_Connect();
    MQTT_Subscribe("your_topic");
    while (1) {
        MQTT_Publish("your_topic", "Hello, MQTT!");
        HAL_Delay(5000);
    }
}


五、应用场景
(一)智能家居
通过 STM32 采集传感器数据(如温度、湿度等),利用 ESP8266 将数据通过 MQTT 协议发送到服务器,用户可以通过手机 APP 订阅相应主题,实时获取家中环境信息。同时,用户也可以通过 APP 发布控制指令,STM32 订阅该主题并接收指令,控制家中智能设备(如灯光、窗帘等)。

(二)工业监测与控制
在工业环境中,STM32 连接各类工业传感器和执行器,通过 ESP8266 与 MQTT 服务器通信。将设备运行状态、生产数据等信息发布到服务器,管理人员可以远程监控设备运行情况。同时,服务器也可以向设备发布控制指令,实现远程控制和故障诊断。

(三)环境监测
多个基于 STM32 和 ESP8266 的节点分布在不同区域,采集环境数据(如空气质量、噪声等),通过 MQTT 协议将数据发送到服务器。服务器对数据进行汇总和分析,为环境管理提供数据支持。

六、总结
通过本文的介绍,我们成功实现了 STM32 通过 ESP8266 连接 MQTT 服务器,完成了物联网设备的基本通信功能。在实际应用中,还可以进一步优化代码,如增加数据加密、提高通信稳定性等。随着物联网技术的不断发展,这种基于 STM32、ESP8266 和 MQTT 的通信方案将在更多领域发挥重要作用,为实现万物互联的愿景提供有力支持。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/duierrorshuobu/article/details/145215476

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2074

主题

16050

帖子

15

粉丝