我使用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地址。
答案 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。
我希望它可以帮助某人〜