我搜索了interwebz,但没有结果。我们面临的问题是,一些Android设备出现了严重的数据包丢失。为了给出一些背景信息,应用程序连接到特定的Wifi并查找端口17216上广播的UDP数据包。这些数据包的大小为832字节(不包括包装的头),并且以每秒4次的正常速率发送。
我们只在两个设备上遇到了这个问题,一个是低端Turbox Rubik II平板电脑,另一个是ASUS备忘录Pad Pad 7。我们测试过的其他设备(手机和平板电脑)都在规定的定期间隔内收集数据包。
接收数据包的功能如下:
public void run()
{
while (isUDPServerRunning)
{
try
{
socket.receive(packet);
ProcessRawPacketData();
DisplayLoggingInfo();
}
catch (IOException e)
{
Log.e("receive", e.getMessage());
e.printStackTrace();
}
}
}
这是Runnable
的一部分。因此,创建了套接字:
byte[] buffer = new byte[1024];
DatagramSocket socket;
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
在onCreate()
扩展的Service
方法中初始化套接字:
socket = new DatagramSocket(SERVERPORT);
这些数据包正在被Wifi模块接收。我们已经确认,通过查找其中一个设备并安装一个数据包嗅探器,这个问题一定是与代码相关的。
在受影响的设备上,数据包被正确地接收了几秒钟,然后有一个完整的丢失,持续了几秒钟,所以我估计损失超过50%。
任何帮助都将不胜感激。我们正在拔头发。
Update I错误地使用了数据包嗅探器。包嗅探器似乎也丢失了根设备上的几个相关数据包。不过,有时候,只需启动数据包嗅探器就可以解决这个问题!像下面建议的那样,打开/关闭蓝牙似乎没有什么区别。这会是另一个硬件问题吗?
更新2是我在socket.receive()
行之后立即打印的日志的一个例子。注意它是如何跳过半分钟的数据包,然后工作几秒钟。
05-25 15:44:38.670: D/LOG(4393): Packet Received
05-25 15:44:38.941: D/LOG(4393): Packet Received
05-25 15:45:09.482: D/LOG(4393): Packet Received
05-25 15:45:09.716: D/LOG(4393): Packet Received
05-25 15:45:09.928: D/LOG(4393): Packet Received
05-25 15:45:10.184: D/LOG(4393): Packet Received
05-25 15:45:10.451: D/LOG(4393): Packet Received
05-25 15:45:10.661: D/LOG(4393): Packet Received
发布于 2015-06-02 22:02:20
数据包丢失(当然,如您所知)可以在传输的多个阶段发生:
您可以通过让其他设备在连接到同一个Wifi路由器时监听相同的广播,快速检查第1点还是第2点是否是问题。听起来你已经这么做了,这是没有问题的。(请注意,如果在服务器上运行WireShark转储,步骤2(有时甚至1)中丢弃的数据包可能不会丢失。)
因此,从第3点到第5点很可能是问题所在,它们可能更难分开。
以下是几件可能有帮助的事情:
最后,这里有一个解决方案,可以肯定地解决这个问题:
向客户端添加一些检测丢弃数据包的代码,如果掉包率太高,则打开到服务器的TCP连接,这将保证数据包的传递。考虑到您的数据包很小且不频繁,而且只有少数设备需要使用此机制,我认为这不会对您的服务器负载造成问题。如果您没有办法更改服务器代码以提供TCP流,则可以编写一个独立的代理服务器来收集UDP数据包并通过TCP提供这些数据包。如果您可以在与原始服务器相同的机器上运行它,您甚至知道它位于哪个IP地址(与到达的UDP数据包的源地址相同)。
发布于 2015-06-02 13:48:24
只是猜测一下,但是你在数据包上的计算需要多长时间?是否有可能套接字分配的缓冲区填满并开始删除包?
我知道,这听起来不太可能以4KB/s的速度.但是,如果你的计算时间超过250毫秒,这迟早会发生。这也解释了为什么有些设备工作起来像一种魅力,而另一些则不然。
您是否尝试删除计算,只打印“已接收的包”消息以进行调试?
发布于 2015-06-02 22:00:07
有趣的是,这两个正在经历UDP数据包丢失的设备都有Mediatek SoC。您的其他测试设备有相同的芯片组吗?
这可能是那些SoC的Wi驱动程序中的一个漏洞。由于它只出现在UDP中,而且并不总是100%,到目前为止,它可能还没有被所有人注意到。
https://stackoverflow.com/questions/30432974
复制相似问题