做个笔记方便以后查阅!这一个版本比较全面,包含两个模块的程序!
以下是两个ESP8266-01S实现通过MQTT协议进行串口透传的程序示例,其中使用了PubSubClient库进行MQTT通信。
ESP8266-01S #1:
```c++
#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// WiFi参数
const char* ssid = "YourSSID";
const char* password = "YourWiFiPassword";
// MQTT服务器参数
const char* mqtt_server = "YourMQTTServer";
const int mqtt_port = 1883;
const char* mqtt_user = "YourMQTTUsername";
const char* mqtt_password = "YourMQTTPassword";
const char* mqtt_topic = "serial/esp01s1";
// 串口透传相关
SoftwareSerial serial(2, 3); // RX, TX
String serial_buffer; // 缓存接收到的数据
// MQTT客户端和WIFI客户端
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
// 初始化串口和WIFI连接
Serial.begin(115200);
serial.begin(115200);
WiFi.begin(ssid, password);
// 等待WIFI连接成功
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
// 连接到MQTT服务器
client.setServer(mqtt_server, mqtt_port);
while (!client.connected()) {
if (client.connect("esp01s1", mqtt_user, mqtt_password)) {
Serial.println("Connected to MQTT server!");
client.subscribe(mqtt_topic);
} else {
Serial.print("Failed to connect to MQTT server! rc=");
Serial.println(client.state());
delay(5000);
}
}
}
void loop() {
// 检查WiFi连接状态
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi disconnected!");
WiFi.disconnect();
delay(1000);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Reconnecting to WiFi...");
}
// 重新连接到MQTT服务器
if (!client.connected()) {
client.connect("esp01s1", mqtt_user, mqtt_password);
client.subscribe(mqtt_topic);
}
}
// 处理MQTT消息
client.loop();
// 检查串口输入缓冲区是否有数据
if (serial.available() > 0) {
String input = "";
while (serial.available() > 0) {
char ch = serial.read();
if (ch == '\n') { // 收到换行符,将数据通过MQTT发送出去
client.publish(mqtt_topic, input.c_str());
Serial.print("Sent: ");
Serial.println(input);
input = "";
} else {
input += ch;
}
}
}
// 检查MQTT消息队列是否有数据
while (client.available()) {
String message = client.readStringUntil('\n');
Serial.print("Received: ");
Serial.print(message);
// 将消息发送到串口输出
serial.print(message);
delay(10); // 等待输出完毕,防止丢失数据
}
}
```
ESP8266-01S #2:
```c++
#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// WiFi参数
const char* ssid = "YourSSID";
const char* password = "YourWiFiPassword";
// MQTT服务器参数
const char* mqtt_server = "YourMQTTServer";
const int mqtt_port = 1883;
const char* mqtt_user = "YourMQTTUsername";
const char* mqtt_password = "YourMQTTPassword";
const char* mqtt_topic = "serial/esp01s1";
// 串口透传相关
SoftwareSerial serial(2, 3); // RX, TX
String serial_buffer; // 缓存接收到的数据
// MQTT客户端和WIFI客户端
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
// 初始化串口和WIFI连接
Serial.begin(115200);
serial.begin(115200);
WiFi.begin(ssid, password);
// 等待WIFI连接成功
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
// 连接到MQTT服务器
client.setServer(mqtt_server, mqtt_port);
while (!client.connected()) {
if (client.connect("esp01s2", mqtt_user, mqtt_password)) {
Serial.println("Connected to MQTT server!");
client.subscribe(mqtt_topic);
} else {
Serial.print("Failed to connect to MQTT server! rc=");
Serial.println(client.state());
delay(5000);
}
}
}
void loop() {
// 检查WiFi连接状态
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi disconnected!");
WiFi.disconnect();
delay(1000);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Reconnecting to WiFi...");
}
// 重新连接到MQTT服务器
if (!client.connected()) {
client.connect("esp01s2", mqtt_user, mqtt_password);
client.subscribe(mqtt_topic);
}
}
// 处理MQTT消息
client.loop();
// 检查串口输入缓冲区是否有数据
if (serial.available() > 0) {
String input = "";
while (serial.available() > 0) {
char ch = serial.read();
if (ch == '\n') { // 收到换行符,将数据通过MQTT发送出去
client.publish(mqtt_topic, input.c_str());
Serial.print("Sent: ");
Serial.println(input);
input = "";
} else {
input += ch;
}
}
}
// 检查MQTT消息队列是否有数据
while (client.available()) {
String message = client.readStringUntil('\n');
Serial.print("Received: ");
Serial.print(message);
// 将消息发送到串口输出
serial.print(message);
delay(10); // 等待输出完毕,防止丢失数据
}
}
```
请注意替换程序中的WiFi和MQTT参数以匹配您的网络设置。此外,由于ESP8266-01S只有两个IO引脚,在这个例子中使用了软件串口。如果您需要更高速率的串口通信或更多外部设备的接口,请考虑使用更高级别的ESP8266开发板,如NodeMCU或Wemos D1 mini。