参考文章:
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模块去发送数据
