ESP8266 向 AP 发送 UDP 字符串

ESP8266 send UDP string to AP

我正在使用 UDP 连接两个 nodemcu 模块。一个nodemcu是无线接入点,另一个nodemcu作为客户端连接到接入点。

此代码在客户端连接时将客户端的 IP 地址发送到 AP:

Udp.beginPacket("192.168.4.1", UDPPort);//send ip to server
    char ipBuffer[20];
    WiFi.localIP().toString().toCharArray(ipBuffer, 20);
    Udp.write(ipBuffer);
    Udp.endPacket();
    Serial.println("Sent ip adress to server");

但是在服务器端我没有收到这个数据包。

客户:

#include <ESP8266WiFi.h>
#include <WiFiUDP.h>

unsigned int UDPPort = 2390;      // local port to listen on

char packetBuffer[255]; //buffer to hold incoming packet
char  replyBuffer[] = "acknowledged";       // a string to send back

WiFiUDP Udp;

void setup() {
    Serial.begin(115200);
    WiFi.begin("Wi-Fi");
    Serial.println();
    Serial.print("Wait for WiFi");

    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: " + WiFi.localIP().toString());

    Udp.begin(UDPPort);

    Udp.beginPacket("192.168.4.1", UDPPort);//send ip to server
    char ipBuffer[255];
    WiFi.localIP().toString().toCharArray(ipBuffer, 255);
    Udp.write(ipBuffer);
    Udp.endPacket();
    Serial.println("Sent ip adress to server");
    }

void loop() {

  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remoteIp = Udp.remoteIP();
    Serial.print(remoteIp);
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // read the packet into packetBufffer
    int len = Udp.read(packetBuffer, 255);
    if (len > 0) {
      packetBuffer[len] = 0;
    }
    Serial.println("Contents:");
    Serial.println(packetBuffer);

    // send a reply, to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(replyBuffer);
    Udp.endPacket();
  }

}

服务器:

#include <ESP8266WiFi.h>
#include <WiFiUDP.h>

unsigned int UDPPort = 2390;      // local port to listen on

char packetBuffer[255]; //buffer to hold incoming packet
char  ReplyBuffer[] = "acknowledged";       // a string to send back
WiFiUDP Udp;
void setup() {
    Serial.begin(115200);

  WiFi.softAP("Wi-Fi");
  Udp.begin(UDPPort);
  Serial.println();
    Serial.println("Started ap. Local ip: " + WiFi.localIP().toString());
}

void loop() {
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remoteIp = Udp.remoteIP();
    Serial.print(remoteIp);
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // read the packet into packetBufffer
    int len = Udp.read(packetBuffer, 255);
    if (len > 0) {
      packetBuffer[len] = 0;
    }
    Serial.println("Contents:");
    Serial.println(packetBuffer);
    // send a reply, to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
  }

}

另一件事不起作用:如果我从连接到 AP nodemcu 的另一台设备向客户端 nodemcu(也连接到 AP)发送数据包,则会收到数据包,但我没有收到设备的确认回复。

其他一切正常——如果我从另一个设备向 AP nodemcu 发送一个数据包,数据包被接收并且我得到确认。 此外,如果我使用客户端 nodemcu 连接到我的家庭 wi-fi 路由器并从我的电脑监听数据包,我会在连接时获得客户端的 IP 地址。

我必须为每个连接的 esp8266 更改端口号。如果esp的IP是192.168.4.2,我设置端口为2302,对于192.168.4.3,我设置为2303...

我一直在煞费苦心地尝试解决类似的问题...

我也无法收到我的 ESP8266 发送的任何包裹

我换了你的线路;

WiFi.softAP("Wi-Fi");
到....
WiFi.mode(WIFI_STA);

现在每次都有效....没有包裹丢失..

我遇到了完全相同的问题。 我刚刚解决了你的代码和我的差不多

所有ESP-模块都可以做AP和station。 这意味着,ESP 模块本身具有本地网络。

在我的例子中,客户端模块(ESP)是站模式,服务器模块(ESP)是SoftAP模式。

服务器模块的ip是192.168.4.9,我设置的网关ip是192.168.4.1。

当客户端模块连接到服务器模块的AP时,客户端的ip是192.168.4.103,然后我尝试从客户端模块向AP发送udp数据包。什么都没有发生,但是当我从其他设备(例如 pc)发送相同的数据包时它起作用了。

我试图在我的笔记本电脑上访问服务器模块的AP。我找到了一个名称为 'EPS_4510DB' 的有线 SSID。它实际上是客户端模块的一个。 ESP_4510DB 的网关 ip 是 192.168.4.1。

突然发现client模块的AP和server模块的AP的网络是一样的, client module(for station)的网络链接了自己的AP网络。

换句话说,客户端模块将udp数据包发送到其自身的AP网络,而不是其中一个服务器模块。

所以我更改了 ip,并且能够将 udp 数据包发送到服务器模块。

如@Barry Bea 所述,我认为您还可以通过在客户端模块而不是服务器模块中使用 WiFi.mode(WIFI_STA) 来禁用客户端模块的 AP。

希望对大家有所帮助~