最近研究了正点原子的lora模块,突发异想自己做一个类似的,刚好手上有一块esp8266-01s,就用这一块板子开发。
上网查了一下关于esp8266-01s模块实现透传功能,结果全部都是使用AT指令实现的,非常不方便,我就想着使用代码完成透传功能。
实现原理也就是将esp8266-01s的串口收到的信息通过mqtt原封不动的发出去,从mqtt接受到的消息原封不动的从串口发出去,就实现了串口透传的功能。
开发工具:Arduino IDE
使用模块:esp8266-01s
测试板:esp8266
模块展示
代码部分
esp8266-01s代码(需要自己配置的地方已经再代码注释部分提示了)
#include <SimpleTimer.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// 定时器
SimpleTimer secondTimer;
// 串口速率配置
#define serial_port_rate 115200 // 这里设置串口速率是115200,你也可以设置为其他速率
// WiFi配置信息
const char* ssid = ""; // WiFi名称
const char* password = ""; // WiFi密码
// mqtt配置信息
String UID = "esp8266-01s"; // 就是mqtt订阅客户端的id
const char* UserName = ""; // 连接mqtt的用户名
const char* PassWord = ""; // 连接mqtt的密码,提示如果你的mqtt服务器没有设置访问的用户名密码就不用填
const char* mqtt_server = ""; // 你的mqtt服务器的IP或者域名
#define mqtt_port 1883 // 默认是1883,如果你的mqtt服务器配置的是其他端口就更改这里即可
WiFiClient espClient;
PubSubClient client(espClient);
// 连接WiFi
void setup_wifi() {
delay(10);
// Serial.println();
// Serial.print("Connecting to ");
// Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
// Serial.print(".");
}
randomSeed(micros());
// Serial.println("");
// Serial.println("WiFi connected");
// Serial.println("IP address: ");
// Serial.println(WiFi.localIP());
}
// mqtt断线重连
void reconnect() {
while (!client.connected()) {
// Serial.print("Attempting MQTT connection...");
String clientId = UID;
clientId = String(random(0xffff), HEX);
if (client.connect(clientId.c_str(),UserName,PassWord)) {
// Serial.println("mqtt connected");
client.publish("heartbeat", "online");
client.subscribe("InTopic");
} else {
// Serial.print("failed, rc=");
// Serial.print(client.state());
// Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
// 消息订阅回调函数
void callback(char* topic, byte* payload, unsigned int length) {
// Serial.print("Message arrived [");
// Serial.print(topic);
// Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
// Serial.println();
}
void setup()
{
// 初始化串口
Serial.begin(serial_port_rate);
// 初始化WiFi
setup_wifi();
// 连接mqtt
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
// 初始化定时器
secondTimer.setInterval(10000);
}
void loop()
{
// mqtt断线重连
if (!client.connected()) {
reconnect();
}
client.loop();
// 定时器10秒发送心跳包
if (secondTimer.isReady()) {
client.publish("heartbeat", "online");
secondTimer.reset();
}
// 检测串口是否有输入,如果有则发布消息
if (Serial.available() > 0) {
client.publish("OutTopic", String(Serial.readString()).c_str());
}
}
esp8266测试代码
#include <SoftwareSerial.h>
SoftwareSerial mySerial(4,5);
void setup(){
Serial.begin(115200);
mySerial.begin(115200);
}
void loop(){
if (mySerial.available() > 0) {
Serial.print(mySerial.readString());
}
if (Serial.available() > 0) {
mySerial.print(Serial.readString());
}
}
接线
esp8266-01s esp8266
RXD -------------> D1
TXD -------------> D2
GND -------------> G
测试效果
串口发送
串口接收