ESP32S3 AP+MQTT Broker

ESP32S3 AP+MQTT Broker

文章目录

  • [ESP32S3 AP+MQTT Broker](#ESP32S3 AP+MQTT Broker)

ESP32S3的作为Broker的代码

需要安装 "PicoMQTT"

cpp 复制代码
#include <WiFi.h>
#include <PicoMQTT.h>

// AP热点配置
const char* AP_SSID     = "ESP32S3_MQTT_AP";
const char* AP_PASSWORD = "mqtt123456";

IPAddress apIP(192, 168, 4, 1);
IPAddress gateway(192, 168, 4, 1);
IPAddress subnet(255, 255, 255, 0);

// 自定义 Broker 类,重写 on_message
class MyMQTTServer : public PicoMQTT::Server {
public:
    using Server::Server;  // 继承基类构造函数

protected:
    // 重写消息处理函数(基类中是 protected virtual)
    void on_message(const char* topic, PicoMQTT::IncomingPacket& packet) override {
        Serial.println("----------------------------------------");
        Serial.print("主题: ");
        Serial.println(topic);

        // 使用 available() 和 read() 读取载荷(Stream 标准方法)
        Serial.print("消息内容: ");
        while (packet.available()) {
            char c = (char)packet.read();   // read() 返回 int
            Serial.print(c);
        }
        Serial.println();
        Serial.println("----------------------------------------");
    }
};

// 创建自定义 Broker 实例(默认端口 1883)
MyMQTTServer mqttServer;

void setup() {
    Serial.begin(115200);
    delay(100);

    WiFi.mode(WIFI_AP);
    WiFi.softAPConfig(apIP, gateway, subnet);
    WiFi.softAP(AP_SSID, AP_PASSWORD);

    Serial.println("======== ESP32-S3 MQTT Broker AP ========");
    Serial.print("热点名称:"); Serial.println(AP_SSID);
    Serial.print("热点密码:"); Serial.println(AP_PASSWORD);
    Serial.print("Broker地址:"); Serial.println(WiFi.softAPIP());
    Serial.println("MQTT端口:1883");
    Serial.println("=========================================");

    mqttServer.begin();
    Serial.println("MQTT Broker 运行就绪,等待设备接入");
}

void loop() {
    mqttServer.loop();
    delay(50);
}

ESP8266 设备1 发布端

cpp 复制代码
#include <ESP8266WiFi.h>
#include <PicoMQTT.h>

const char* WIFI_SSID = "ESP32S3_MQTT_AP";
const char* WIFI_PASSWORD = "mqtt123456";
const char* MQTT_BROKER_IP = "192.168.4.1";
const uint16_t MQTT_BROKER_PORT = 1883;

PicoMQTT::Client mqtt;

// 消息回调(可选,用于接收自己的消息)
void on_message(const char* topic, const char* payload) {
    Serial.printf("收到消息 [主题: %s] 内容: %s\n", topic, payload);
}

void setup() {
    Serial.begin(115200);
    delay(100);

    WiFi.mode(WIFI_STA);
    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    Serial.print("正在连接 WiFi");
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("\nWiFi 已连接,IP: " + WiFi.localIP().toString());

    // 订阅(可选)
    mqtt.subscribe("test/topic", on_message);

    mqtt.connect(
        MQTT_BROKER_IP,
        MQTT_BROKER_PORT,
        "ESP8266_Client",
        nullptr, nullptr,
        nullptr, nullptr,
        0, 0, false, true, nullptr
    );
    Serial.println("MQTT 客户端已启动");
    Serial.println("请在串口输入消息,按回车发送到 test/topic");
}

void loop() {
    mqtt.loop();

    // 检查串口是否有输入
    if (Serial.available()) {
        String payload = Serial.readStringUntil('\n'); // 读取整行
        payload.trim(); // 去除首尾空格/换行
        if (payload.length() > 0) {
            mqtt.publish("test/topic", payload.c_str());
            Serial.printf("已发布: %s\n", payload.c_str());
        }
    }
    delay(10);
}

ESP8266 设备2订阅端

cpp 复制代码
#include <ESP8266WiFi.h>
#include <PicoMQTT.h>

const char* WIFI_SSID = "ESP32S3_MQTT_AP";
const char* WIFI_PASSWORD = "mqtt123456";
const char* MQTT_BROKER_IP = "192.168.4.1";
const uint16_t MQTT_BROKER_PORT = 1883;

PicoMQTT::Client mqtt;

// 消息回调
void on_message(const char* topic, const char* payload) {
    Serial.printf("[订阅者] 收到消息 - 主题: %s, 内容: %s\n", topic, payload);
}

void connect_mqtt() {
    bool connected = mqtt.connect(
        MQTT_BROKER_IP,
        MQTT_BROKER_PORT,
        "ESP8266_Subscriber",   // 唯一客户端 ID
        nullptr, nullptr,
        nullptr, nullptr,
        0, 0, false, true, nullptr
    );
    if (connected) {
        Serial.println("MQTT 连接成功!");
        // 连接成功后订阅主题
        mqtt.subscribe("test/topic", on_message);  // 明确订阅发布者使用的主题
        mqtt.subscribe("#", on_message);           // 保留通配符,用于调试
    } else {
        Serial.println("MQTT 连接失败!请检查 Broker 是否运行");
    }
}

void setup() {
    Serial.begin(115200);
    delay(100);

    WiFi.mode(WIFI_STA);
    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    Serial.print("正在连接 WiFi");
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("\nWiFi 已连接,IP: " + WiFi.localIP().toString());

    connect_mqtt();
}

void loop() {
    mqtt.loop();

    // 如果断开,尝试重连
    if (!mqtt.connected()) {
        Serial.println("MQTT 断开,尝试重连...");
        connect_mqtt();
        delay(1000);
    }
    delay(10);
}