完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
所以免责声明。我几乎不知道自己在做什么……所以我首先要说的是,不久前我从英国亚马逊购买了以下产品:
反正。我想用它通过我的 WiFi 无线触发中继。我希望这种响应尽可能接近即时,而我第一次使用这些芯片时遇到了使用 TCP 的延迟问题,所以我想“我将使用 UDP”。这个想法是我们在网络中,所以数据包丢失应该非常低,如果我在 X 时间内没有收到响应作为备份,我可以处理重新发送数据。 无论如何,我写了这个(在 VSCode 中使用 Platform.IO): 代码:全选#include #include // Include the Wi-Fi library #include // Save the WIFI settings const char* ssid = "REDACTED"; const char* password = "REDACTED"; // WIFI Setup WiFiUDP Udp; unsigned int localUdpPort = 4210; char incomingPacket[256]; void setup() { // Start the Serial communication to send messages to the computer Serial.begin(9600); delay(10); // Connect to the WiFi WiFi.begin(ssid, password); // Wait for the WiFi signal while (WiFi.status() != WL_CONNECTED) { delay(1000); } // Listen Udp.begin(localUdpPort); } void loop() { // Try reading the next packet int packetSize = Udp.parsePacket(); if (packetSize) { int len = Udp.read(incomingPacket, 255); if (len > 0) incomingPacket[len] = 0; Serial.printf( "Received %d bytes from %s, port %d: %s\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort(), incomingPacket ); } } 这是我能想到的最简单的代码,用于打印 UDP 数据包中的有用信息。 无论如何,我随后使用了以下 Python 代码: 代码:全选import socket import time UDP_IP = "REDACTED (Even if it's internal...)" UDP_PORT = 4210 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP i = 1 while True: print("Sent", i) sock.sendto(bytes(str(i), "utf-8"), (UDP_IP, UDP_PORT)) sock.sendto(bytes(str(i), "utf-8"), (UDP_IP, UDP_PORT)) sock.sendto(bytes(str(i), "utf-8"), (UDP_IP, UDP_PORT)) i += 1 time.sleep(4) 因此,只需每 4 秒发送三次消息。我已经用我的手机测试过这个。每条消息每次都通过路由器。当发送到我的手机(在同一个 WiFi 上)时,它几乎永远不会失败。但是从我的 ESP8266 我得到以下信息: 代码:全选Received 1 bytes from , port 63661: 2 Received 1 bytes from , port 63661: 2 Received 1 bytes from , port 63661: 2 Received 1 bytes from , port 63661: 4 Received 1 bytes from , port 63661: 4 Received 1 bytes from , port 63661: 4 Received 1 bytes from , port 63661: 6 Received 1 bytes from , port 63661: 6 Received 1 bytes from , port 63661: 6 Received 1 bytes from , port 63661: 8 Received 1 bytes from , port 63661: 8 Received 1 bytes from , port 63661: 8 Received 1 bytes from , port 63661: 9 Received 1 bytes from , port 63661: 9 Received 1 bytes from , port 63661: 9 Received 2 bytes from , port 63661: 11 Received 2 bytes from , port 63661: 11 Received 2 bytes from , port 63661: 11 Received 2 bytes from , port 63661: 13 Received 2 bytes from , port 63661: 13 Received 2 bytes from , port 63661: 13 Received 2 bytes from , port 63661: 14 Received 2 bytes from , port 63661: 14 Received 2 bytes from , port 63661: 14 Received 2 bytes from , port 63661: 15 Received 2 bytes from , port 63661: 15 Received 2 bytes from , port 63661: 15 Received 2 bytes from , port 63661: 16 Received 2 bytes from , port 63661: 16 Received 2 bytes from , port 63661: 16 Received 2 bytes from , port 63661: 18 Received 2 bytes from , port 63661: 18 Received 2 bytes from , port 63661: 18 第一个数据包几乎肯定会失败。然后它会碰运气任何给定的批次是否会通过(它确实倾向于交替通过和失败)。但请注意,它永远不会让 3 个数据包中的 1 个数据包失败。它始终是全有或全无类型的事情。 如果有任何帮助,我将不胜感激……接近 50% 的数据包丢失对我来说有点高到无法维持。我注意到了一些事情。我在发送数据包之间放置的时间越长,失败的可能性就越大。虽然这样基本上完全无法使用。 我做错了什么可怕的事吗?我将不胜感激任何帮助! |
|
相关推荐
1个回答
|
|
参考一下, UDP 数据包丢失可能有多种原因,包括但不限于:
1. 网络拥塞:当网络中的流量过大时,数据包可能会因为在网络中被堆积而丢失。 2. 数据包错误:UDP 是无连接的协议,数据包没有确认机制。如果数据包出现错误,接收方将无法检测到并请求重发。 3. 路由错误:UDP 是无连接的协议,数据包是以无序的方式发送的,所以可能因为路由错误而丢失。 4. 防火墙限制:防火墙可能会拦截 UDP 数据包,从而导致数据包丢失。 5. 连接中断:在数据包发送或接收期间,连接可能会中断并导致数据包丢失。 |
|
|
|
只有小组成员才能发言,加入小组>>
475浏览 6评论
399浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
380浏览 5评论
385浏览 4评论
361浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-1 16:58 , Processed in 0.678621 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号