Пример AsyncUDP на двух ESP32 не работает: "WL_NO_SSID_AVAIL" - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь создать прямую клиент-серверную WiFi-сеть между двумя ESP32 DEVKITV1s , работающими от USB-портов двух компьютеров.

Я загрузил пример с помощью Arduino IDE (с URL менеджера дополнительных плат https://dl.espressif.com/dl/package_esp32_index.json) и статус WiFi (на обеих платах) WL_NO_SSID_AVAIL .

Код клиента:

#include "WiFi.h"
#include "AsyncUDP.h"

const char * ssid = "my_ssid";
const char * password = "my_password";

AsyncUDP udp;

void setup()
{
    Serial.begin(115200);
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    if (WiFi.waitForConnectResult() != WL_CONNECTED) {
        Serial.println("WiFi Failed");
        while(1) {
            delay(1000);
        }
    }
    if(udp.connect(IPAddress(192,168,1,100), 1234)) {
        Serial.println("UDP connected");
        udp.onPacket([](AsyncUDPPacket packet) {
            Serial.print("UDP Packet Type: ");
            Serial.print(packet.isBroadcast()?"Broadcast":packet.isMulticast()?"Multicast":"Unicast");
            Serial.print(", From: ");
            Serial.print(packet.remoteIP());
            Serial.print(":");
            Serial.print(packet.remotePort());
            Serial.print(", To: ");
            Serial.print(packet.localIP());
            Serial.print(":");
            Serial.print(packet.localPort());
            Serial.print(", Length: ");
            Serial.print(packet.length());
            Serial.print(", Data: ");
            Serial.write(packet.data(), packet.length());
            Serial.println();
            //reply to the client
            packet.printf("Got %u bytes of data", packet.length());
        });
        //Send unicast
        udp.print("Hello Server!");
    }
}

void loop()
{
    delay(1000);
    //Send broadcast on port 1234
    udp.broadcastTo("Anyone here?", 1234);
}

Код сервера:

#include "WiFi.h"
#include "AsyncUDP.h"

const char * ssid = "my_ssid";
const char * password = "my_password";

AsyncUDP udp;

void setup()
{
    Serial.begin(115200);
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    if (WiFi.waitForConnectResult() != WL_CONNECTED) {
        Serial.println("WiFi Failed");
        while(1) {
            delay(1000);
        }
    }
    if(udp.listen(1234)) {
        Serial.print("UDP Listening on IP: ");
        Serial.println(WiFi.localIP());
        udp.onPacket([](AsyncUDPPacket packet) {
            Serial.print("UDP Packet Type: ");
            Serial.print(packet.isBroadcast()?"Broadcast":packet.isMulticast()?"Multicast":"Unicast");
            Serial.print(", From: ");
            Serial.print(packet.remoteIP());
            Serial.print(":");
            Serial.print(packet.remotePort());
            Serial.print(", To: ");
            Serial.print(packet.localIP());
            Serial.print(":");
            Serial.print(packet.localPort());
            Serial.print(", Length: ");
            Serial.print(packet.length());
            Serial.print(", Data: ");
            Serial.write(packet.data(), packet.length());
            Serial.println();
            //reply to the client
            packet.printf("Got %u bytes of data", packet.length());
        });
    }
}

void loop()
{
    delay(1000);
    //Send broadcast
    udp.broadcast("Anyone here?");
}

У кого-нибудь еще были проблемы с запуском примера кода на ESP32 с использованием Arduino IDE?

1 Ответ

0 голосов
/ 19 января 2020

Итак, мои недоразумения были следующими:

  1. Пример AsyncUDP не разрешает прямую связь клиент-сервер. Требуется промежуточный маршрутизатор, например, домашний маршрутизатор. Это связано с настройкой WiFi.mode (WIFI_STA) - серверу нужно было установить WiFi.mode (WIFI_AP) для подключения других ESP32.
  2. И клиент, и сервер должны использовать udp Функция .listen (порт) для получения сообщений (где вы можете указать порт). Чтобы отправлять сообщения, используйте udp.broadcast (message) для сервера и udp.broadcastTo (message, port) для клиента.

Следующий код является наименьшим примером, который я смог сделать, чтобы он все еще работал. Я уверен, что есть примеры получше, но именно так я получил пример работы для связи между двумя ESP32 без HTTP-запросов с использованием промежуточного маршрутизатора и т. Д. c ...

На стороне клиента:

#include "WiFi.h"
#include "AsyncUDP.h"

const char * ssid = "my_ssid";
const char * password = "my_password";

AsyncUDP udp;

int port = 1234;

void setup() {
    Serial.begin(115200);
    WiFi.mode(WIFI_STA); // Make this the client (the server is WIFI_AP)
    WiFi.begin(ssid, password);
    delay(100);

    Serial.print("Connecting...");
    // Display a period every 0.5 s to show the user something is happening.
    while (WiFi.waitForConnectResult() != WL_CONNECTED) { 
      Serial.print(".");    
      delay(500);
    }
    Serial.println("");

    if(udp.listen(port)) {
        udp.onPacket([](AsyncUDPPacket packet) {
          Serial.print("Received data: ");
            Serial.write(packet.data(), packet.length());
            Serial.println();
        });
    }
}

void loop(){
    delay(1000);
    udp.broadcastTo("A message for the server from the client.", port);
}

На стороне сервера:

#include "WiFi.h"
#include "AsyncUDP.h"

const char *my_ssid = "my_ssid";
const char *password = "my_password";

int port = 1234;

AsyncUDP udp;

void setup(){
    Serial.begin(115200);
    WiFi.mode(WIFI_AP);
    WiFi.softAP(my_ssid, password);
    delay(100);

      if(udp.listen(port)) {
        udp.onPacket([](AsyncUDPPacket packet) {
            Serial.print("Data: ");
            Serial.write(packet.data(), packet.length());
            Serial.println();  
          });
      }
}

void loop() {
    delay(1000);
    udp.broadcastTo("Anyone here? Love from the server.", port);
}
...