欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ESP8266 AP模式TCP server 串口透传

程序员文章站 2024-03-23 09:36:40
...

背景:Linux设备装整机后出问题需要调试必须拆壳,不方便,预留调试线影响设备密封性,所以想到使用无线模块把调试串口透传到PC。

解决方案:

1、ESP8266开机进入AP模式,AP的SSID关联设备SN,调试人员根据SSID关联的SN可以知道需要接入的待调试产品。

2、ESP8266开机启动TCP server,该SERVER只能接入一个客户端,当客户端接入后循环接收串口数据发给客户端,接收客户端数据发给串口,实现数据透传。

实现代码如下,AP SSID关联SN部分因涉及公司产品细节已略去,一个简单的demo,待完善。

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <WiFiServer.h>

#ifndef APSSID
#define APSSID "ESP8266ap"
#define APPSK  "12345678"
#endif

/* Set these to your desired credentials. */
const char *ssid = APSSID;
const char *password = APPSK;

WiFiServer server(22333); //声明服务器对象

void setup() {
  delay(1000);
  Serial.begin(115200);
  Serial.println();
  Serial.print("Configuring access point...");
  /* You can remove the password parameter if you want the AP to be open. */
  WiFi.softAP(ssid, password);

  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);

  server.begin(); //服务器启动监听端口号22333
}

void loop()
{
    WiFiClient client = server.available(); //尝试建立客户对象
    if (client) //如果当前客户可用
    {
        Serial.println("[Client connected]");
        uint8_t readBuf[256];

        //!!!注意:此处为处理一次接收大于256字节情况

        while (client.connected()) //如果客户端处于连接状态
        {
            int inComingBytes = client.available();  //接收客户端数据转发给串口
            if(inComingBytes && inComingBytes < 256){
              client.read(readBuf, inComingBytes);
              Serial.write(readBuf, inComingBytes);
            }
   
            inComingBytes = Serial.available();  //接收串口数据转发给客户端
            if(inComingBytes && inComingBytes < 256){
              Serial.read((char*)readBuf, inComingBytes);
              client.write(readBuf, inComingBytes);
            }
        }
        client.stop(); //结束当前连接:
        Serial.println("[Client disconnected]");
    }
}