ESP32 用WIFi搭建TCP的Server和Client 代码

1、WIFI Server code

#include <Arduino.h>
#include <wifi.h>
#define HEART_PERIOD_SEC  180
#define TASK_PERIOD_SEC   5
#define PAYLOAD_BUFF_SIZE 50
#define SOCKET_RX_BUFF_SIZE 255
#define MAX_SRV_CLIENTS 4
#define MAX_AP_CONNECTS 10

#pragma pack(1)
typedef struct{
  uint32_t timecnt;
  char     buff[PAYLOAD_BUFF_SIZE];
  uint16_t sizebuff;
}payload_t;
#pragma pack()
const char *ssid = "esp_server_jacky";
const char *password = "12345678";
uint16_t serverPort = 12222;         //服务器端口号
WiFiServer server; //声明一个客户端对象,用于与服务器进行连接
WiFiClient serverClients[MAX_SRV_CLIENTS];
IPAddress localIP(192,168,4,22);
IPAddress gateway(192,168,4,22);
IPAddress subnet(255,255,255,0);

bool isSocketTcpValid = false;
uint32_t timecnt = 0;
uint32_t heartBeatTimeCntLast = 0;
uint32_t taskSendTimeCntLast = 0;
payload_t myPayload;
uint8_t socketRxBuff[SOCKET_RX_BUFF_SIZE];
uint16_t socketRxLen;
uint16_t sendCnt = 0;
void setup() {
  Serial.begin(9600);
  Serial.println("----------------app start----------------");
  
  WiFi.mode(WIFI_AP); //设置工作在AP模式 WIFI_AP
  WiFi.softAPsetHostname("ESP32_NODE");
  WiFi.softAPConfig(localIP,gateway,subnet);
  while(!WiFi.softAP(ssid)){};
  Serial.println("AP start success!");
  
  Serial.print("host name:  ");
  Serial.println(WiFi.softAPgetHostname());
  Serial.print("IP address: ");
  Serial.println(WiFi.softAPIP()); //打印模块IP
  Serial.print("mac Address: ");
  Serial.println(WiFi.softAPmacAddress()); //打印网关地址
  server.begin(serverPort); //服务器启动监听端口号12222
  Serial.print("server listen port: ");
  Serial.println(serverPort);
  server.setNoDelay(true);
}
void loop() {
    
  uint8_t i;
  //检测服务器端是否有活动的客户端连接
  if (server.hasClient()){
    for(i = 0; i < MAX_SRV_CLIENTS; i++){
      //查找空闲或者断开连接的客户端,并置为可用
      if (!serverClients[i] || !serverClients[i].connected()){
        if(serverClients[i]) serverClients[i].stop();
        serverClients[i] = server.available();
        Serial.print("New client: "); Serial.println(i);
        continue;
      }
    }
    //若没有可用客户端,则停止连接
    WiFiClient serverClient = server.available();
    serverClient.stop();
  }
  //检查客户端的数据
  for(i = 0; i < MAX_SRV_CLIENTS; i++){
    if (serverClients[i] && serverClients[i].connected()){
      if(serverClients[i].available()){
        //从Telnet客户端获取数据,并推送到URAT端口
        while(serverClients[i].available()) Serial.write(serverClients[i].read());
      }
    }
  }
}

2、WIFI Client code

#include <Arduino.h>
#include <wifi.h>
#define HEART_PERIOD_SEC  180
#define TASK_PERIOD_SEC   5
#define PAYLOAD_BUFF_SIZE 50
#define SOCKET_RX_BUFF_SIZE 255
#pragma pack(1)
typedef struct{
  uint32_t timecnt;
  char  buff[PAYLOAD_BUFF_SIZE];
  uint16_t sizebuff;
}payload_t;
#pragma pack()
const char *ssid = "Tsinghua17";
const char *password = "QINGHUA2019";
const IPAddress serverIP(121,36,229,131); //欲访问的地址 我的华为云
uint16_t serverPort = 12222;         //服务器端口号
WiFiClient client; //声明一个客户端对象,用于与服务器进行连接
bool isSocketTcpValid = false;
uint32_t timecnt = 0;
uint32_t heartBeatTimeCntLast = 0;
uint32_t taskSendTimeCntLast = 0;
payload_t myPayload;
uint8_t socketRxBuff[SOCKET_RX_BUFF_SIZE];
uint16_t socketRxLen;
uint16_t sendCnt = 0;
void setup() {
  Serial.begin(9600);
  Serial.println();
  
  WiFi.disconnect();
  WiFi.mode(WIFI_STA); //设置工作在STA模式 WIFI_AP
  WiFi.setSleep(false); //关闭STA模式下wifi休眠,提高响应速度
  WiFi.setHostname("esp32_jacky"); //设置主机名
  WiFi.begin(ssid,password);
  while(!WiFi.isConnected()){
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi Connected!");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP()); //打印模块IP
  Serial.print("subnetMask: ");
  Serial.println(WiFi.subnetMask()); //打印子网掩码
  Serial.print("gateway: ");
  Serial.println(WiFi.gatewayIP()); //打印网关地址
  Serial.print("dns: ");
  Serial.println(WiFi.dnsIP()); //打印DNS地址
  Serial.print("mac Address: ");
  Serial.println(WiFi.macAddress()); //打印mac地址
  Serial.print("HostName: ");
  Serial.println(WiFi.getHostname()); //打印主机名
  Serial.println(WiFi.status());
}

void loop() {
    
    //check valid and reconnect
    if( !isSocketTcpValid ){
      isSocketTcpValid =  client.connect(serverIP, serverPort);
    }
    /*!  write data */
    timecnt =  millis();
    
    //heart beat
    if(isSocketTcpValid && timecnt - heartBeatTimeCntLast >= HEART_PERIOD_SEC*1000){
      client.write("client heart cmd");
      heartBeatTimeCntLast = timecnt;
    }
    //task send
    if(isSocketTcpValid && timecnt - taskSendTimeCntLast >= TASK_PERIOD_SEC*1000){
      myPayload.timecnt = millis();
      Serial.print("task send :");
      Serial.println(++sendCnt);
      myPayload.sizebuff = snprintf(myPayload.buff,PAYLOAD_BUFF_SIZE,"client payload: timemills %d",myPayload.timecnt);
      client.write((char*)myPayload.buff,myPayload.sizebuff);
      taskSendTimeCntLast = timecnt;
      heartBeatTimeCntLast = timecnt;
    }

    /*! read data */
    if (isSocketTcpValid && client.available()) //如果已连接或有收到的未读取的数据
    {
      socketRxLen = client.readBytes(socketRxBuff,SOCKET_RX_BUFF_SIZE);
      socketRxBuff[socketRxLen] = 0;
      Serial.println((char*)socketRxBuff);
    }
}

client 关闭: client.stop();

 

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,可以通过以下步骤实现ARDUINO ESP32自动重连WIFITCPSERVER: 1. 首先,需要在代码中定义WIFITCPSERVER的参数,包括SSID、密码、服务器IP和端口号。 例如: ``` const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* serverIP = "your_SERVER_IP"; int serverPort = your_SERVER_PORT; ``` 2. 接下来,在setup()函数中,需要连接WIFI并建立TCP连接: 例如: ``` WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("WiFi connected"); WiFiClient client; while (!client.connect(serverIP, serverPort)) { delay(1000); Serial.println("Connecting to server..."); } Serial.println("Server connected"); ``` 3. 为了实现自动重连,需要在loop()函数中添加重连逻辑。首先,需要检查WIFI连接状态和TCP连接状态: 例如: ``` if (WiFi.status() != WL_CONNECTED) { Serial.println("WiFi disconnected"); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Reconnecting to WiFi..."); } Serial.println("WiFi reconnected"); } if (!client.connected()) { Serial.println("Server disconnected"); while (!client.connect(serverIP, serverPort)) { delay(1000); Serial.println("Reconnecting to server..."); } Serial.println("Server reconnected"); } ``` 4. 最后,为了避免频繁重连造成的资源浪费,可以添加一定的时间间隔限制,例如每10秒钟检查一次连接状态: 例如: ``` unsigned long lastCheckTime = 0; unsigned long checkInterval = 10000; void loop() { if (millis() - lastCheckTime > checkInterval) { lastCheckTime = millis(); // Check connection status and reconnect if necessary // ... } // Other code // ... } ``` 通过以上步骤,即可实现ARDUINO ESP32自动重连WIFITCPSERVER的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值