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。
希望对大家有所帮助~
我正在使用 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。
希望对大家有所帮助~