经典 ESP8266建立tcp服务器 数据串口转发

发布时间 2023-07-22 16:26:10作者: MKT-porter

 

 

 

 

//例子介绍:8266作为WiFiServer端,打开TCP调试助手,模拟TCP Client的请求

#include <SoftwareSerial.h>
//实例化软串口
SoftwareSerial mySerial(D1, D2); // RX, TX


#include <ESP8266WiFi.h>

const int maxMsg =100; // 接收区缓存长度


  
const char* ssid = "yaoyao";
const char* password = "love123456";
#define MAX_SRV_CLIENTS 2  //做多多少个客户端可以连接

WiFiServer server(6666);    //创建server 端口号是6666

WiFiClient serverClients[MAX_SRV_CLIENTS];   //定义最多多少个client可以连接本server(一般不要超过4个)
 
void setup() {

  mySerial.begin(9600);
//mySerial.println("Hello, world?");

  Serial.begin(9600);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("\n连接到:"); 
  Serial.println(ssid);
  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED && i++ < 20) {
    delay(500);
  }
  if (i == 21) {
    Serial.print("没能连接到:"); 
    Serial.println(ssid);
    return ;
  }
  
  server.begin();  //启动server
  server.setNoDelay(true);//关闭小包合并包功能,不会延时发送数据
 
  Serial.print("准备好了!使用网络吧 IP是: ");
  Serial.print(WiFi.localIP());
  Serial.println(" 端口是: 6666");
}


/*
 wl_tcp_state 包括:

CLOSED = 0,// 关闭
LISTEN = 1,// 监听中
SYN_SENT = 2,
SYN_RCVD = 3,
ESTABLISHED = 4,// 建立连接
FIN_WAIT_1 = 5,
FIN_WAIT_2 = 6,
CLOSE_WAIT = 7,
CLOSING = 8,
LAST_ACK = 9,
TIME_WAIT = 10
*/

void loop() {
  uint8_t i;

  //1 检测新链接
  if (server.hasClient()) {  //判断是否有新的client请求进来
    Serial.print("测试新客户 "); 
    for (i = 0; i < MAX_SRV_CLIENTS; i++) {
      
      //释放旧无效或者断开的client
      if (!serverClients[i] || !serverClients[i].connected()) {
        if (!serverClients[i]) {
          //serverClients[i]    判断指定序号的客户端是否有效
          serverClients[i].stop();  //停止指定客户端的连接
        }
        
        serverClients[i] = server.available();//分配最新的client
        Serial.print("1个新的客户端: "); 
        Serial.println(i);
        break; //跳出一层for循环
      }
    }
    
    //当达到最大连接数 无法释放无效的client,需要拒绝连接
    if (i == MAX_SRV_CLIENTS) {
      WiFiClient client = server.available();
      client.stop();
      Serial.println("连接被拒绝 ");
    }
  }

  
  //2 检测client发过来的数据
  for (i = 0; i < MAX_SRV_CLIENTS; i++) {
    if (serverClients[i] && serverClients[i].connected()) {
      if (serverClients[i].available()) {

        String line = serverClients[i].readStringUntil(';');
        Serial.print(line);
        
        /*
        int ind=0;
        char RecMsg[maxMsg];
        while (serverClients[i].available()) {

          RecMsg[ind]=serverClients[i].read();
          if (ind<maxMsg){
             ind++;}
          else{
            Serial.println("缓存区域溢满");
            Serial.println(String(RecMsg));
            ind=0;
            }
 
        }
        Serial.println(String(RecMsg));
        */
      }
      
     
    }
  }
   //3接收串口数据 发送
   if (Serial.available()){
      //Serial.available()  mySerial
      String comdata =Serial.readStringUntil(';');
      //Serial.println(comdata);
       for (i = 0; i < MAX_SRV_CLIENTS; i++) {
          if (serverClients[i] && serverClients[i].connected()) {   
              // char cArr[comdata.length() + 1];
             //comdata.toCharArray(cArr,comdata.length() + 1);      
            //serverClients[i].write(cArr, comdata.length() + 1);//向客户端发送数据
            serverClients[i].println(comdata); 
            delay(1);
          }
        }
      
  }

  
 
}