ESP32 项目中使用 PubSubClient

本文主要介绍如何在 ESP32 项目中使用 PubSubClient ,实现客户端与 MQTT 服务器的连接、订阅、收发消息等功能。

作为 ESP8266 的升级版本,ESP32 是物联网项目的理想选择。除了 Wi-Fi 模块,该模块还包含蓝牙 4.0 模块。双核 CPU 工作频率为 80 至 240 MHz,包含两个 Wi-Fi 和蓝牙模块以及各种输入和输出引脚。

本文将分别介绍通过 TCP 端口和来连接 ESP32 客户端到 MQTT 服务器。

前置准备 

在进行连接之前,您需要准备好 MQTT 服务器和客户端。

获得 MQTT 服务器 

使用 EMQX 提供的 免费公共 MQTT 服务器,该服务基于 EMQX 的 MQTT 物联网云平台 创建。服务器接入信息如下:

  • Broker: iot.xpstem.com
  • TCP Port: 1883

Arduino IDE 

本文中使用 Arduino IDE 作为代码编辑和上传,Arduino 集成开发环境(或是 ArduinoIDE)包含了一个用于写代码的文本编辑器、一个消息区、一个文本控制台以及一个带有常用功能按钮和文本菜单的工具栏。软件连接 Arduino 和 Genuino 之后,能给所连接的控制板上传程序,还能与控制板相互通信。

安装依赖 

在 Arduino IDE 中完成以下安装。

  1. 安装 ESP32 开发板。

    点击工具 -> 开发板 -> 开发板管理。搜索 ESP32,点击安装。

  2. 安装 PubSub client 库。

    点击项目 -> 加载库 -> 管理库...。搜索 PubSubClient,安装 PubSubClient by Nick O’Leary。

通过 TCP 端口连接 

本章节介绍了如何在 Arduino IDE 中通过 TCP 端口连接 ESP32 和 MQTT 服务器。

  1. 导入 WiFi 和 PubSubClient 库。
    #include <WiFi.h>
    #include <PubSubClient.h>
  2. 设置 Wi-Fi 名称和密码,以及 MQTT 服务器连接地址和端口。

    示例代码将使用公共 MQTT 服务器来连接,公共 MQTT 服务器无需设置用户名和密码。如果您创建了部署,请在部署控制台找到相应的连接地址,请参考 默认认证设置用户名和密码。

    // WiFi Credentials
    const char *ssid = "WIFI_SSID";            // Replace with your WiFi name
    const char *password = "WIFI_PASSWORD";  // Replace with your WiFi password
    
    // MQTT Broker Settings
    const char *mqtt_broker = "iot.xpstem.com";
    const char *mqtt_topic = "user/******";
    const char *mqtt_username = "******";
    const char *mqtt_password = "******";
    const int mqtt_port = 1883;
  3. 打开串行连接,以便于输出程序的结果并且连接到 Wi-Fi 网络。
    void setup() {
        Serial.begin(115200);
        connectToWiFi();
        mqtt_client.setServer(mqtt_broker, mqtt_port);
        mqtt_client.setKeepAlive(60);
        mqtt_client.setCallback(mqttCallback); // Corrected callback function name
        connectToMQTT();
    }
    
    void connectToWiFi() {
        WiFi.begin(ssid, password);
        Serial.print("Connecting to WiFi");
        while (WiFi.status() != WL_CONNECTED) {
            delay(500);
            Serial.print(".");
        }
        Serial.println("\nConnected to WiFi");
    }
  4. 使用 PubSubClient 连接到公共 MQTT Broker。
    void connectToMQTT() {
        while (!mqtt_client.connected()) {
            String client_id = "esp32-client-" + String(WiFi.macAddress());
            Serial.printf("Connecting to MQTT Broker as %s.....\n", client_id.c_str());
            if (mqtt_client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
                Serial.println("Connected to MQTT broker");
                mqtt_client.subscribe(mqtt_topic);
                mqtt_client.publish(mqtt_topic, "Hi XPSTEM I'm ESP32 ^^"); // Publish message upon successful connection
            } else {
                Serial.print("Failed, rc=");
                Serial.print(mqtt_client.state());
                Serial.println(" try again in 5 seconds");
                delay(5000);
            }
        }
    }
  5. MQTT 服务器连接成功后,ESP32 将向 MQTT 服务器发布消息和订阅 esp32/test 主题消息。
    // publish and subscribe
    mqtt_client.subscribe(mqtt_topic);
    mqtt_client.publish(mqtt_topic, "Hi XPSTEM I'm ESP32 ^^"); // Publish message upon successful connection
  6. 设置回调函数将主题名称打印到串行端口并打印从 esp32/test 主题接收的消息。
    void mqttCallback(char *mqtt_topic, byte *payload, unsigned int length) {
        Serial.print("Message received on mqtt_topic: ");
        Serial.println(mqtt_topic);
        Serial.print("Message: ");
        for (unsigned int i = 0; i < length; i++) {
            Serial.print((char) payload[i]);
        }
        Serial.println("\n-----------------------");
    }

完整代码示例如下:

#include <WiFi.h>
#include <PubSubClient.h>

// WiFi Credentials
const char *ssid = "WIFI_SSID";            // Replace with your WiFi name
const char *password = "WIFI_PASSWORD";  // Replace with your WiFi password

// MQTT Broker Settings
const char *mqtt_broker = "iot.xpstem.com";
const char *mqtt_topic = "user/******";
const char *mqtt_username = "******";
const char *mqtt_password = "******";
const int mqtt_port = 1883;

WiFiClient espClient;
PubSubClient mqtt_client(espClient);

// Function Declarations
void connectToWiFi();

void connectToMQTT();

void mqttCallback(char *mqtt_topic, byte *payload, unsigned int length);

void setup() {
    Serial.begin(115200);
    connectToWiFi();
    mqtt_client.setServer(mqtt_broker, mqtt_port);
    mqtt_client.setKeepAlive(60);
    mqtt_client.setCallback(mqttCallback); // Corrected callback function name
    connectToMQTT();
}

void connectToWiFi() {
    WiFi.begin(ssid, password);
    Serial.print("Connecting to WiFi");
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("\nConnected to WiFi");
}

void connectToMQTT() {
    while (!mqtt_client.connected()) {
        String client_id = "esp32-client-" + String(WiFi.macAddress());
        Serial.printf("Connecting to MQTT Broker as %s.....\n", client_id.c_str());
        if (mqtt_client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
            Serial.println("Connected to MQTT broker");
            mqtt_client.subscribe(mqtt_topic);
            mqtt_client.publish(mqtt_topic, "Hi XPSTEM I'm ESP32 ^^"); // Publish message upon successful connection
        } else {
            Serial.print("Failed, rc=");
            Serial.print(mqtt_client.state());
            Serial.println(" try again in 5 seconds");
            delay(5000);
        }
    }
}

void mqttCallback(char *mqtt_topic, byte *payload, unsigned int length) {
    Serial.print("Message received on mqtt_topic: ");
    Serial.println(mqtt_topic);
    Serial.print("Message: ");
    for (unsigned int i = 0; i < length; i++) {
        Serial.print((char) payload[i]);
    }
    Serial.println("\n-----------------------");
}


void loop() {
    if (!mqtt_client.connected()) {
        connectToMQTT();
    }
    mqtt_client.loop();
}

测试连接 

在成功连接 MQTT 服务器后,您可以使用 Arduino IDE 和 MQTTX 测试连接。

  1. 请使用 Arduino IDE 将完整代码上传到 ESP32,并打开串口监视器,选择 115200 波特率查看 ESP32 连接情况。 
  2. 建立 MQTTBox 客户端 与 MQTT 服务器的连接, 并向 ESP32 发送消息。 
- 本文内容来自网络,如有侵权,请联系本站处理。

2022-11   阅读(630)   评论(0)
 标签: 创客电子 ESP32 物联网

涨知识
EDA

电子设计自动化(英语:Electronic design automation,缩写:EDA)是指利用计算机辅助设计(CAD)软件,来完成超大规模集成电路(VLSI)芯片的功能设计、综合、验证、物理设计(包括布局、布线、版图、设计规则检查等)等流程的设计方式。

评论:
相关文章
MimiClaw应用与开发教程1:部署和测试

MimiClaw‌ 是一款基于 ‌ESP32-S3‌ 芯片的超轻量级AI助手,适合嵌入式AI与物联网开发者快速部署本地化AI代理。本系列教程基于MimiClaw的Arduino移植版本进行讲解,小节主要讲解部署和测试。


ESP32扫描wifi 热点列表

就像我们用手机打开WiFi功能后可以浏览附近的可用WiFi。要将手机连接到热点,通常需要打开Wi-Fi设置应用程序,列出可用的网络,然后选择所需的热点。然后输入密码(或不输入密码),可以使用ESP32进行相同的操作。


MimiClaw 配置飞书机器人和添加硬件控制技能

本文本介绍配置飞书机器人为MimiClaw的一个输入/输出端,和添加一个控制WS2812与LED的控制技能。


ESP32-S3 部署 MimicLaw 完整教程:从零到成功调用 DeepSeek

一块 30 块钱的开发板 + 一个大模型 API,就能做出可以听懂人话的智能硬件。 本文记录完整安装过程和踩坑经验,确保你跟着做就能跑通。


MimiClaw 架构全解析,把 “智能龙虾” 跑在 ESP32 上

本文将从手绘架构图入手,逐层拆解 MimiClaw 的分层设计、核心模块、数据流转与底层实现,带你解剖这只“智能虾”的技术骨架,看懂在 C 语言加持下,AI 智能体如何以可穿戴设备的形态,在你身边稳稳运行、离线服务、主动响应。


如何用 platform.local.txt 深度定制 ESP32 编译流程?

本文介绍如何在不脱离 ArduinoIDE 可视化开发的前提下,通过一个名为 platform.local.txt 的小文件,实现对 ESP32 编译流程的精准控制。


优化Arduino-ESP32程序体积

本文将系统分析程序体积增长的五大根源,并提供经过验证的优化方案,帮助减小固件大小。


开发ESP32大模型AI语音助手-从软件到硬件

本文所DIY的语音助手设备端使用的是MicroPython、服务端是Python,对于很多开发者来说MicroPython入门没难度。


【ESP32 C++教程】Unit10-2:音频录制

本小节使用音频开发框架实现一个音频录制到文件的示例。


ESP32 I2S 接口深度解析:从时序、格式到 ESP-IDF 驱动实战

I2S协议通过BCLK、LRCLK和DATA三线精准传输音频数据,但时序边沿、帧格式、时钟源等细节常引发噪声或断连。本文详解ESP32的I2S实现,从协议原理到ESP-IDF v5.x代码配置,助你避开常见陷阱,确保音频稳定传输。