ESP8266向AP发送UDP字符串

时间:2016-08-21 12:28:14

标签: arduino udp esp8266 nodemcu

我使用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地址。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我一直在努力解决类似的问题......

我也无法获得ESP8266发送的任何包裹

我改变了你的路线;

<强> WiFi.softAP( “无线网络”);
到.... 的 WiFi.mode(WIFI_STA);

现在每天都在工作....没有包丢失..

答案 2 :(得分:1)

我遇到了完全相同的问题。 我已经解决了。您的代码与我的代码几乎相同。

所有ESP-模块都可以是AP和station。 这意味着,ESP模块本身具有局域网。

在我的情况下,客户端模块(ESP)是工作站模式,服务器模块(ESP)是SoftAP模式。

服务器模块的IP为192.168.4.9,我设置网关的IP为192.168.4.1。

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

我试图访问笔记本电脑上服务器模块的AP。我发现了一个有线SSID,名称为“ EPS_4510DB”。它实际上是客户端模块的模块。 ESP_4510DB的网关IP为192.168.4.1。

突然我意识到客户端模块的 AP 和服务器模块的 AP 的网络是相同的,并且客户端模块(用于站点)的网络已链接自己的AP网络。

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

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

就像@Barry Bea提到的那样,我认为您也可以通过在客户端模块而非服务器模块中使用WiFi.mode(WIFI_STA)来禁用客户端模块的AP。

我希望它可以帮助某人〜