esp8266-01s实现串口mqtt透传

最近研究了正点原子的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

测试效果

串口发送 

 

串口接收

 

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值