当前位置: 首页 > backend >正文

0_外设学习_ESP8266+云流转(no 0基础)

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

http://www.xdnf.cn/news/17251.html

相关文章:

  • 最新的GPT5效果如何,我试了一下(附加GPT5大模型免费使用方法)
  • 力扣-189.轮转数组
  • 秋招笔记-8.8
  • 《Leetcode》-面试题-hot100-链表
  • django uwsgi启动报错failed to get the Python codec of the filesystem encoding
  • Android 系统的安全 和 三星安全的区别
  • C++信息学奥赛一本通-第一部分-基础一-第3章-第1节
  • RAG初步实战:从 PDF 到问答:我的第一个轻量级 RAG 系统(附详细项目代码内容与说明)
  • 2025年渗透测试面试题总结-07(题目+回答)
  • 系统网络端口安全扫描脚本及详解
  • Chrome与Firefox浏览器安全运维配置命令大全:从攻防到优化的专业实践
  • 分治-快排-215.数组中的第k个最大元素-力扣(LeetCode)
  • 【Linux】从零开始:RPM 打包全流程实战万字指南(含目录结构、spec 编写、分步调试)
  • Android 的CameraX的使用(配置,预览,拍照,图像分析,录视频)
  • 使用Python提取PDF大纲(书签)完整指南
  • 持中文的 TXT 合并 PDF 工具 —— GUI + ReportLab 实战
  • Emacs 折腾日记(二十九)—— 打造C++ IDE
  • 使用 Grunt 替换 XML 文件中的属性值
  • 亚马逊跨类目铺货广告运营:从粗放投放to智能提效的省力法则
  • iOS混淆工具有哪些?跨平台 App 混淆与保护的实用方案
  • 零基础深度学习规划路线:从数学公式到AI大模型的系统进阶指南
  • 基于linux环境在centos7上部署gitlab
  • Claude Code 实战场景解析:从代码生成到系统重构的典型应用案例
  • 【类与对象(中)】C++类默认成员函数全解析
  • 智慧农业温室大棚物联网远程监控与智能监测系统
  • 一站式体育赛事平台源码解决方案
  • 虚拟机Ubuntu图形化界面root用户登录错误
  • 用 Go 写个极简反向代理,把 CC 攻击挡在业务容器之外
  • 设计模式(二)——策略模式
  • ABP VNext + Fody AOP:编译期织入与性能监控