ESP32到ESP32 WiFi服务器/客户端问题

时间:2018-12-08 13:04:24

标签: c++ arduino wifi microcontroller esp32

我有一个ESP32充当客户端,另一个ESP32充当直接通信和室外使用的访问点。 我已经在AP端设置了一个服务器,希望客户端与之通信,但是我似乎无法完成这项工作。

我想知道两件事:

  1. 如何从客户端向服务器发送数据或将数据写入服务器?
  2. 如何读取和显示从客户端发送到服务器的数据?

我已附上以下代码:

AP /服务器的代码

//SERVER
//Load Wi-Fi library
#include <WiFi.h>

// Replace with your network credentials
const char* ssid     = "ESP32-Access-Point";
const char* password = "SyedAhmedAli";
 //Set web server port number to 80

WiFiServer server(80);


void setup() {
  Serial.begin(115200);
  Serial.println("Setting AP (Access Point)…");

  WiFi.softAP(ssid, password);  

  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address ");
  Serial.println(IP);
  Serial.print("MAC address ");
  Serial.println(WiFi.softAPmacAddress());

  server.begin();

}

void loop(){

  WiFiClient client = server.available();    //Listen for incoming clients

  if (client) 
  {                                          //If a new client connects,
    Serial.println("New Client.");           //print a message out in the serial port





    while (client.connected()) 
    {           
    Serial.println("Client connected.");
    Serial.println(client.available());

     if (client.available() > 0) 
     {
      // read the bytes incoming from the client:
      char thisChar = client.read();
      // echo the bytes back to the client:
      server.write(thisChar);
      // echo the bytes to the server as well:
      Serial.write(thisChar);
     }


    }
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println();
  }
}

客户代码

//Client
#include <WiFi.h>

const char* ssid = "ESP32-Access-Point";
const char* password =  "SyedAhmedAli";


WiFiClient client;

IPAddress server(192, 168, 4, 1);    

void setup()
{
  Serial.begin(115200);
  Serial.println();

  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
   while (WiFi.status() != WL_CONNECTED)
   {
    delay(500);
    Serial.print(".");
   }
    Serial.println(" connected");
     if(client.connect(server, 80))
      {
        Serial.println("connected to server");
        client.write("Data");
      }
     else
     {
        Serial.println("failed to connect to server");
     }

}


void loop()
{

}

3 个答案:

答案 0 :(得分:2)

或者替代上一个答案,您可以使用espnow作为各种esp32之间的协议。这里是example

答案 1 :(得分:0)

您必须实现TCP,UDP之类的协议才能交换数据。

使用TCP的示例项目 https://www.instructables.com/id/WiFi-Communication-Between-Two-ESP8266-Based-MCU-T/

使用UDP的示例项目 https://circuits4you.com/2018/01/01/esp-to-esp-communication/

答案 2 :(得分:0)

看看这个非常方便的功能:

void SetWifi(const char *name, const char *password) { // Turn on wifi with server
    Serial.println("Starting server");
    WiFi.disconnect();
    WiFi.softAP(name, password);
    delay(2000);
    IPAddress IP = WiFi.softAPIP();
    Serial.print("Server IP : ");
    Serial.println(IP);
    server.begin();
    server.setNoDelay(true);
    Serial.println("Server started");
}

你可以用这个函数写数据:

void sendDataTCP(String message) {  // function to send message back to client
    if (client && client.connected()) { //check if client is there
        client.println(message);
    }
    client.flush();
}

用这个函数接收数据:

void availableMessage() {
    if (client.available()) {//check if client is there
        while (client.available()) {
            String message = client.readStringUntil('\n');  //read string until enter (end of message)
            Serial.println("Received: " + message);
            message.toCharArray(buffer, BUFFER);           // put message in char array (buffer)
            client.flush(); // discard all bytes that have been read
        }
    }
}

检查是否有人已连接:

void connectClient() {
    if (server.hasClient())                          // if server has a client
    {
        if (client = server.available()) {            // if client is connected
            Serial.println("Connected");
        }
    }
}

我认为这会让你朝着实现目标的方向前进,祝你好运!