esp8266实现mqtt(二)

参考文章:

Arduino IDE搭建ESP32或ESP8266开发环境(附离线安装包)_arduino esp8266离线包-CSDN博客

ESP01S 串口 MQTT 透传_esp-01s mqtt-CSDN博客

之前通过AT指令固件实现了8266完成MQTT传输功能。

ESP8266实现mqtt_esp8266 mqtt-CSDN博客

但是实际还有一些弊端,AT指令的固件虽然功能强大但是作为单纯的WiFi模块来说每次上电都需要单片机通过AT指令去配置比较麻烦。

这次介绍直接通过arduino直接实现8266自动连接固定网络并订阅固定主题,然后直接把串口的ASCII码格式数据透传出去。

这样单片机部分就简化了AT指令部分,而且发送数据也比较直接简单。

安装环境

可以直接参考这个,实测好用。反正我是最后环境是靠博主提供的离线安装包实现的

Arduino IDE搭建ESP32或ESP8266开发环境(附离线安装包)_arduino esp8266离线包-CSDN博客

下载程序

使用程序前还需要安装一个库<PubSubClient.h>

从工具-》管理库,然后下载

然后只要把相关配置改一下就可以了

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

// WiFi配置
const char* ssid = "xxx";        // WiFi名称
const char* password = "xxx"; // WiFi密码

// MQTT配置
const char* mqtt_server = "192.168.1.103"; // MQTT服务器地址
const int mqtt_port = 1883;                    // MQTT端口
const char* mqtt_user = "xxx";       // MQTT用户名
const char* mqtt_pass = "xxx";       // MQTT密码
const char* mqtt_client_id = "ESP01S_Client";  // 客户端ID

// 主题配置
const char* topic_uart_to_mqtt = "homeassistant/sensor/aht10/state";  // 串口→MQTT主题 === 传感器数据上传
const char* topic_mqtt_to_uart = "homeassistant/sensor/aht10/control";  // MQTT→串口主题 === HA远程控制设备

WiFiClient espClient;
PubSubClient client(espClient);

// 串口缓冲区配置
#define SERIAL_BUFFER_SIZE 512
char serialBuffer[SERIAL_BUFFER_SIZE];
int bufferIndex = 0;

// 连接状态
bool wifiConnected = false;
bool mqttConnected = false;

void setup() {
  // 初始化串口
  Serial.begin(115200);
  
  // 初始化LED引脚
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);  // 初始关闭LED
  
  // 连接WiFi
  setup_wifi();
  
  // 设置MQTT
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(mqttCallback);
  client.setBufferSize(512);
  
  // 静默启动,无串口输出
  digitalWrite(2, LOW);
  delay(100);
  digitalWrite(2, HIGH);
  delay(100);
  digitalWrite(2, LOW);
  delay(100);
  digitalWrite(2, HIGH);  // LED闪烁3次表示启动完成
}

void setup_wifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  int attempts = 0;
  while (WiFi.status() != WL_CONNECTED && attempts < 30) {
    delay(500);
    attempts++;
  }

  if (WiFi.status() == WL_CONNECTED) {
    wifiConnected = true;
  }
}

void mqttCallback(char* topic, byte* payload, unsigned int length) {
  // 静默处理MQTT消息,直接转发到串口
  for (unsigned int i = 0; i < length; i++) {
    Serial.write(payload[i]);
  }
  Serial.write('\n');  // 可选:添加换行符
  
  // 收到消息时快速闪烁LED
  digitalWrite(2, LOW);
  delay(20);
  digitalWrite(2, HIGH);
}

void processSerialData() {
  while (Serial.available()) {
    char c = Serial.read();
    
    // 检测数据结束(换行符或缓冲区满)
    if (c == '\n' || bufferIndex >= SERIAL_BUFFER_SIZE - 1) {
      if (bufferIndex > 0) {
        serialBuffer[bufferIndex] = '\0';
        
        // 静默发送到MQTT,无任何串口输出
        if (client.connected()) {
          client.publish(topic_uart_to_mqtt, serialBuffer);
          
          // 发送成功时快速闪烁LED
          digitalWrite(2, LOW);
          delay(20);
          digitalWrite(2, HIGH);
        }
        
        bufferIndex = 0;
      }
    } else if (c != '\r') {
      // 存储有效字符
      if (bufferIndex < SERIAL_BUFFER_SIZE - 1) {
        serialBuffer[bufferIndex++] = c;
      }
    }
    
    delay(1);
  }
}

void reconnect() {
  if (WiFi.status() != WL_CONNECTED) {
    wifiConnected = false;
    setup_wifi();
    return;
  }
  
  if (!client.connected()) {
    if (client.connect(mqtt_client_id, mqtt_user, mqtt_pass)) {
      client.subscribe(topic_mqtt_to_uart);
      mqttConnected = true;
      
      // 连接成功时LED指示
      digitalWrite(2, LOW);
      delay(500);
      digitalWrite(2, HIGH);
    } else {
      mqttConnected = false;
    }
  }
}

void loop() {
  // 维持网络连接
  if (!client.connected()) {
    reconnect();
    delay(3000);
  } else {
    client.loop();
  }
  
  // 处理串口数据
  processSerialData();
  
  delay(10);
}

然后直接编译下载就可以了。这个下载程序比较简单不需要IO0和RST短接什么的直接就成功了

验证

本地电脑通过MQTT.fx来订阅,然后模块之间通过ttl模块去发送数据

相关推荐
调试优选官1 天前
IoT物联网系统定制落地实践:从设备接入、协议网关、平台分层到业务应用,如何做技术选型、交付验收、责任边界与长期运维成本评估及迁移安排
物联网·iot·成本分析
华允物联-HUAIOT2 天前
工业路由器和DTU在联网方式上的区别
物联网
wuyk5552 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
码流子2 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
绿蕉2 天前
配电房的“AI听诊师”:可视化声纹局放智能巡检系统与通讯保障
物联网
chshang19922 天前
工业路由器是什么?浅谈5G工业网络中的IR602
网络·物联网·5g·智能路由器
做萤石二次开发的哈哈2 天前
海康商用音频主机接入萤石蓝海 AIoT:多路拾音、矩阵路由、分区广播、应急广播四类技能,IP 网络广播系统多端开发实战
物联网·音频矩阵·萤石开放平台·ip网络广播·蓝海aiot一站式工作台·aiot开发·公共广播
wuyk5552 天前
【Socket 进阶之路】第 9 章 Linux 网络服务量产稳定性优化|心跳保活、TIME_WAIT、SO_LINGER、内存池、断线重连、完整异常防护框架
linux·服务器·开发语言·网络·物联网
CServer_012 天前
开源!混合存储底座+湖仓一体的AI数据中台
物联网·制造
数字新视界2 天前
数据中心基础设施管理系统的智能监测与运维整合剖析
数据库·物联网·数据中心·数据中心基础设施管理·dcim管理系统