乐鑫技术交流
直播中

李春梅

8年用户 1981经验值
私信 关注
[问答]

请问ESP8266如何在UDP中设置本地端口?

我正在尝试使用 AT 命令制作 Access Point UDP 服务器。
简而言之,它有效,但我无法控制ESP8266本地端口,因为它是由芯片随机设置的。
我想创建一个具有已知固定端口的服务器,以便远程客户端可以启动连接(即 无需知道该随机端口即可访问它)。
我使用的命令是:
AT CWMODE=2 (或 3)
在 cipmux=0 时
AT+CIPSTART="UDP","192.168.4.2",50000
-> at that point, I have to use AT+CIPSTATUS to get the ESP8266 port number.
然后在 CIPSEND 等工作
有什么想法吗?谢谢!
               

回帖(1)

那年我十七_

2024-7-15 17:11:03
ESP8266 在使用 UDP 时,确实不能直接设置本地端口。但是,您可以通过以下方法实现类似的效果:

1. 使用 TCP 而不是 UDP:ESP8266 允许您在 TCP 模式下设置本地端口。您可以使用 AT 命令 `AT+CIPSERVER=1,50000,0` 来创建一个监听端口为 50000 的 TCP 服务器。然后,您可以使用 `AT+CIPSEND` 命令发送数据。

2. 使用多播地址:如果您的应用程序可以容忍多播地址,您可以使用多播地址来实现类似的效果。在这种情况下,您可以设置一个固定的多播地址,然后让 ESP8266 加入该多播组。这样,所有连接到该多播组的设备都可以接收到 ESP8266 发送的数据。

3. 使用第三方库:有一些第三方库,如 ESPAsyncUDP,可以帮助您实现在 ESP8266 上设置固定端口的 UDP 服务器。这些库通常使用更高级的编程技巧来实现这一功能,但它们可以为您提供更多的灵活性和控制。

以下是使用 ESPAsyncUDP 库的示例代码:

```cpp
#include
#include

const char *ssid = "your_SSID";
const char *password = "your_PASSWORD";

AsyncUDP udp;

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);

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

  if (udp.listen(50000)) {
    Serial.print("UDP server listening on port: ");
    Serial.println(50000);
  }
}

void loop() {
  AsyncUDPMessage msg;
  if (udp.parsePacket()) {
    udp.read(msg);
    Serial.print("Received packet from: ");
    Serial.print(msg.remoteIP());
    Serial.print(":");
    Serial.print(msg.remotePort());
    Serial.print(" to local port: ");
    Serial.print(msg.localPort());
    Serial.print(" length: ");
    Serial.println(msg.length());
    // Process the received data here
  }
}
```

请注意,使用第三方库可能需要您具备一定的编程知识。如果您不熟悉这些库,可能需要花费一些时间学习如何使用它们。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分