1、環境+要求
????????2個ESP8266模塊、2個USB轉ESP8266,通過ESP8266_A-->(阿里云)云流轉-->ESP8266_B,實現ESP8266_A發布話題,ESP8266_B訂閱該話題。
2、阿里云云流轉配置
????????1、基礎要求:
? ? ? ? ? ? ? ? 添加1個產品(包含2個設備,標記2個設備的MQTT的信息(略))
????????2、只講重點
? ? ? ? ? ? ? ? 阿里云云流轉配置(網上很多-略),需要注意的重點是:數據源中的話題,可以一樣
若需要修改為自定義的話題,可以在產品一欄進行添加,然后在產品流轉欄刪除更換新的話題
3、ESP8266_B作為訂閱配置
? ? ? ? 1、添加庫文件ArduinoMqttClient
? ? ? ? ? ? ? ?在arduino里下載即可
????????
? ? ? ? 2、編寫ESP8266_B的訂閱代碼
#include <ArduinoMqttClient.h>
#if defined(ARDUINO_SAMD_MKRWIFI1010) || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_AVR_UNO_WIFI_REV2)#include <WiFiNINA.h>
#elif defined(ARDUINO_SAMD_MKR1000)#include <WiFi101.h>
#elif defined(ARDUINO_ARCH_ESP8266)#include <ESP8266WiFi.h>
#elif defined(ARDUINO_PORTENTA_H7_M7) || defined(ARDUINO_NICLA_VISION) || defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_GIGA) || defined(ARDUINO_OPTA)#include <WiFi.h>
#elif defined(ARDUINO_PORTENTA_C33)#include <WiFiC3.h>
#elif defined(ARDUINO_UNOR4_WIFI)#include <WiFiS3.h>
#endif#include "arduino_secrets.h"
char ssid[] = "wifi名字"; // 你的WiFi名稱
char pass[] = "wifi密碼"; // 你的WiFi密碼WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);// MQTT服務器信息
const char broker[] = "設備2的MQTT的mqttHostUrl";
int port = 1883;
const char willTopic[] = "arduino/will";// 重點:訂閱的主題需要與發布的主題匹配(這里修改為發布日志中的主題)
//如/k1j6lspLmdS/ESP8266_B/user/get,ESP8266_B訂閱話題
// /k1j6lspLmdS/ESP8266_B/user/update,ESP8266_B發布話題
//注意訂閱和發布的設備名字和get/update
const char inTopic[] = "/k1j6lspLmdS/ESP8266_B/user/get"; // 改為發布的主題
const char outTopic[] = "arduino/out";// 設備認證信息(保持不變)
const char clientId[] = "MQTT的clientId";
const char username[] = "MQTT的username";
const char password[] = "MQTT的密碼";const long interval = 10000;
unsigned long previousMillis = 0;
int count = 0;void setup() {Serial.begin(115200);while (!Serial) {;} // 等待串口連接// 連接WiFiSerial.print("連接WiFi: ");Serial.println(ssid);while (WiFi.begin(ssid, pass) != WL_CONNECTED) {Serial.print(".");delay(5000);}Serial.println("\nWiFi連接成功");// 配置MQTT客戶端mqttClient.setId(clientId);mqttClient.setUsernamePassword(username, password);// 設置遺囑消息String willPayload = "設備離線";mqttClient.beginWill(willTopic, willPayload.length(), true, 1);mqttClient.print(willPayload);mqttClient.endWill();// 連接MQTT服務器Serial.print("連接MQTT服務器: ");Serial.println(broker);if (!mqttClient.connect(broker, port)) {Serial.print("MQTT連接失敗! 錯誤碼: ");Serial.println(mqttClient.connectError());while (1);}Serial.println("MQTT服務器連接成功");// 設置消息接收回調mqttClient.onMessage(onMqttMessage);// 關鍵修正:執行實際訂閱操作int subscribeQos = 0; // QoS等級if (mqttClient.subscribe(inTopic, subscribeQos)) {Serial.print("成功訂閱主題: ");Serial.println(inTopic);} else {Serial.print("訂閱主題失敗: ");Serial.println(inTopic);
}
}void loop() {mqttClient.poll(); // 必須定期調用,用于接收消息和保持連接
}// 消息接收回調函數
// 消息接收回調函數
void onMqttMessage(int messageSize) {// 存儲接收到的主題和消息內容String topic = mqttClient.messageTopic();String payload;// 讀取消息內容while (mqttClient.available()) {payload += (char)mqttClient.read();}// 打印接收到的信息Serial.println("-------------------");Serial.print("收到消息,主題: '");Serial.print(topic);Serial.print("',長度: ");Serial.println(messageSize);Serial.print("內容: ");Serial.println(payload);Serial.println("-------------------");// 在這里可以添加消息處理邏輯// 例如判斷特定命令并執行相應操作if (payload == "ON") {Serial.println("執行打開操作");// digitalWrite(LED_PIN, HIGH); // 示例:控制LED} else if (payload == "OFF") {Serial.println("執行關閉操作");// digitalWrite(LED_PIN, LOW); // 示例:控制LED}
}
3、上述過程中,編寫代碼在arduino中,使用USB轉ESP8266,將代碼燒錄到ESP8266模塊里。
4、ESP8266_A發布話題
5、ESP8266_B訂閱話題
6、上述代碼
https://gitee.com/dawn-of-a-new-century/learn_peripheral_modules