下面是基于 Arduino IDE 的 ESP8266 串口透传程序,通过 MQTT 中转数据。需要使用 PubSubClient 库来支持 MQTT 协议。
接线:
- 将两个ESP8266 01s的GND、VCC、TX、RX引脚分别连接。其中一个ESP8266作为发布端(Publisher),另一个作为订阅端(Subscriber)。
- 两个ESP8266模块TX接受电路板的RX,电路板TX接收ESP8266模块的RX。
- 确保两个ESP8266模块都已烧录好 AT 固件,并正确地配置了连接 WiFi 网络的参数。
在 Arduino IDE 中安装 PubSubClient 库:Sketch -> Include Library -> Manage Libraries,搜索 "pubsubclient" 并点击安装。
代码如下:
```
#include <PubSubClient.h>
#include <SoftwareSerial.h>
// WiFi信息
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
// MQTT信息
const char* mqtt_server = "YOUR_MQTT_SERVER";
const char* mqtt_username = "YOUR_MQTT_USERNAME";
const char* mqtt_password = "YOUR_MQTT_PASSWORD";
const char* mqtt_topic_pub = "topic/tx"; // Publisher 发送到该主题
const char* mqtt_topic_sub = "topic/rx"; // Subscriber 订阅该主题
// 创建软串口对象
SoftwareSerial Serial1(D3, D4); // RX: D3, TX: D4
// 创建MQTT客户端对象
WiFiClient espClient;
PubSubClient client(espClient);
// 保存已连接到WiFi和MQTT服务器的状态
bool connected_wifi = false;
bool connected_mqtt = false;
// 连接WiFi
void connectWiFi() {
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
connected_wifi = true;
}
// 连接MQTT服务器
void connectMQTT() {
if (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str(), mqtt_username, mqtt_password)) {
Serial.println("connected");
client.subscribe(mqtt_topic_sub); // 订阅主题
connected_mqtt = true;
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
connected_mqtt = false;
}
}
}
// 发布数据到MQTT主题
void publishData(String data) {
if (connected_mqtt) {
client.publish(mqtt_topic_pub, data.c_str());
}
}
// 当接收到新数据时,回调函数将被调用
String serial_data_received = "";
void callback(char* topic, byte* payload, unsigned int length) {
for (int i=0; i<length; i++) { // 将字节数据转换成字符串类型
serial_data_received += (char)payload[i];
}
publishData(serial_data_received); // 将数据发布到MQTT主题
Serial.println("Data received: " + serial_data_received); // 打印接收到的数据
serial_data_received = ""; // 清空串口接收的数据
}
void setup() {
Serial.begin(115200);
Serial1.begin(115200);
connectWiFi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (connected_wifi) {
if (!connected_mqtt) {
connectMQTT();
} else {
client.loop();
if (Serial1.available()) { // 发送端有数据可用
String s = "";
while(Serial1.available()) { // 不断读取数据直到串口里没有可读字节为止
char c = Serial1.read();
s += c;
delay(2); // 等待缓冲区填充
}
publishData(s); // 将数据发布到MQTT主题上
Serial.println("Data sent: " + s);
}
}
}
}
```
注意以下几点:
- ESP8266 的软串口是通过软件实现的,需要使用两个GPIO引脚来作为RX和TX管脚,并在程序中初始化。
- 在程序中,将模块连接到 WiFi 网络并连接到 MQTT 连接器。
- 在回调函数中,串口接收到的新数据将被转发到 `mqtt_topic_pub` 主题上,并打印出来作为日志记录。
上传代码后打开串口监视器查看输出日志。如果没有错误,您将看到串口通过MQTT收发数据的成功消息。
注意:如果使用其他GPIO引脚作为软串口管脚,则需要在程序中更新引脚配置。