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) {;} // 等待串口连接
// 连接WiFi
Serial.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
ESP8266与阿里云云流转配置学习
4万+

被折叠的 条评论
为什么被折叠?



