在 ESP-01 WiFi 中无法从客户端向服务器发送数据

问题描述 投票:0回答:2

使用 ESP8266WiFi 库,我有两个通过 WiFi 连接的 ESP-01/ESP8266。当客户端向服务器发送请求(全部非 HTML!)(使用端口 5000 - 以防止与 HTTP、FTP 等混淆)时,它可以完美地工作。但我无法让客户端从服务器收到答复。现在,在 ESP8266WiFi 库(3.0.2)中,有一条注释说 server.write() 没有实现,我应该使用 server.accept() 而不是 server.available();虽然我没有看到任何使用 server.accept() 的适用示例,但我看到很多使用 client.print() 的示例,所以我尝试遵循这些示例 - 但还没有成功。我正在做的事情如下:1.建立与WiFi的连接; 2. 让客户端连接到服务器并向服务器发送两个字节。 3. 对服务器 ESP8266 的引脚进行数字写入。(这会切换继电器,工作正常) 4. 从服务器向客户端回写数字写入已完成。在客户端,写入服务器后,我循环运行了大约 10 秒钟,试图从服务器接收某些内容,但从未收到。然后我循环回到开头,客户要求再次切换继电器 - 这可以很好地运行几个小时。

任何关于我应该采取不同做法的见解都将受到高度赞赏。我真的希望在服务器切换中继后能够向客户端返回一些确认。或者如果有人有一个使用 server.accept() 的工作示例 - 我也会尝试。

客户端代码:

int pin_value;
uint8_t ip[4];
void setup()
{
    Serial.begin(115200);
    ip[0]=10;
    ip[1]=0;
    ip[2]=0;
    ip[3]=6;
    
    //We connect to the WiFi network
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    //Wait until connected
    while (WiFi.status() != WL_CONNECTED){
      delay(500);
      Serial.print(".");
      }
  Serial.print("Client - ");
  Serial.println("WiFi connected");
}

void loop(){ 
    //Variable that we will use to connect to the server
    WiFiClient client;
    //if not able to connect, return.
    if (!client.connect(ip, SERVER_PORT)){  return; }

    // We create a buffer to put the send data
    uint8_t buffer[Protocol::BUFFER_SIZE];
    
    //We put the pin number in the buffer
    // whose state we want to send
    buffer[Protocol::PIN] = RELAY;
    //put the current state of the pin in the send buffer
    buffer[Protocol::VALUE] = pin_value;
    //We send the data to the server
    client.write(buffer, Protocol::BUFFER_SIZE);
      
    // try to read the answer from the server for about 10 seconds
    int nr_of_tries = 10000;
     
    while (client.connected()  && nr_of_tries > 0)
      {if (client.available())
        { String line = client.readStringUntil('\n');
          nr_of_tries = 0;
          Serial.print("line= ");
          Serial.println(line);
          }
        else
          {delay(1);
          nr_of_tries=nr_of_tries-1;
          }
      }
   Serial.print("nr of tries= ");
   Serial.println(nr_of_tries);
   Serial.print("connected: ");
   Serial.println(client.connected());
       
   client.flush();
   client.stop();
   Serial.println(" change sent");
   if (pin_value == 0) 
     {pin_value =1;
      Serial.println("Pin_value set to 1");
     }
   else
     {pin_value=0;
     Serial.println("Pin_value set to 0");}
   delay(10000);
}

服务器端代码:

WiFiServer server(SERVER_PORT);

void setup()
{
  Serial.begin(115200); // must have the same baud rate as the serial monitor
  pinMode(RELAY,OUTPUT);
  digitalWrite(RELAY, LOW);
  
  // Connect to the WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println("Server - ");
  Serial.println("WiFi connected");
  // Set this ESP to behave as a WiFi Access Point
  // WiFi.mode(WIFI_AP);
  // set SSID and Password to connect to this ESP
  // WiFi.softAP(SSID, PASSWORD);
  
  // Start the server
  server.begin();
  Serial.println("Server started");
  
  // Output of the IP address
  Serial.print("Use this IP to connect: ");
  Serial.println(WiFi.localIP());
}

void loop()
{
    // Check if there is any client connecting
    WiFiClient client = server.available();
    if (client) 
    {      
        //Serial.println("Client detected");
        //If the client has data he wants to send us
        //check for a second or so as transmission can take time
        int nr_of_tries = 1000;
        while(!client.available() && nr_of_tries > 0)
          { nr_of_tries=nr_of_tries-1;
            delay(1);
          }
        if (client.available())
          {
            // Serial.println(" Client data");
            // create a buffer to put the data to be received
            uint8_t buffer[Protocol::BUFFER_SIZE];
            
            // We put the data sent by the client in the buffer
            // but do not read more than the buffer length.
            int len = client.read(buffer, Protocol::BUFFER_SIZE);
            
            // retrieve which pin number the client sent
            int pinNumber = buffer[Protocol::PIN];
            
            Serial.print("Pin Number: ");
            Serial.println(pinNumber);
            // retrieve the value of this pin
            int value = buffer[Protocol::VALUE];
            Serial.print("Value: ");
            Serial.println(value);
            // Set the pin indicated by the received pin number in output mode
            // but only if the pin is the GPIO0 pin!
            if (pinNumber == RELAY)
              { pinMode(pinNumber, OUTPUT);
                // Set the pin indicated by the received pin number to the passed value
                digitalWrite(pinNumber, value);
              } 
             // tell the client that the relay has been set or reset.
             size_t i;
             if (value == 0) {
               i=server.println("Set");
               Serial.print("i= ");
               Serial.println(i); 
               }
               else {
               i=server.println("Reset");
               Serial.print("i= ");
               Serial.println(i); 
               }
              
             }
        }

        //Close the connection with the client
        //client.stop();
    }

常用定义:

#include <ESP8266WiFi.h>

const char* ssid = "blablabla";
const char* password = "blublublu";
#define SERVER_PORT 5000
#define RELAY 0

//Protocol that the Server and Client will use to communicate
enum Protocol{
    PIN, // Pin whose state you want to change
    VALUE, // State to which the pin should go (HIGH = 1 or LOW = 0)
    BUFFER_SIZE // The size of our protocol. IMPORTANT: always leave it as the last item of the enum
};
server client two-way esp8266wifi
2个回答
0
投票

解决了! 通过更改 server.println("Set");进入 client.println("Set") 并在服务器端代码中低几行执行相同的“Reset”传输,它可以工作!


0
投票

请阅读此便条的人给我发电子邮件,并附上注明需要射频帮助的便条[电子邮件受保护],我的理智取决于你

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.