我没有结果地搜查了interwebz.我们正面临着一些Android设备遭遇严重丢包的问题.为了给出一些背景知识,应用程序连接到特定的Wifi并查找在端口17216上广播的UDP数据包.这些数据包的大小为832字节,不包括包装的标头,并以每秒四个的常规速率发送.
我们只在两台设备上遇到了问题,一台低端的Turbox Rubik II平板电脑和一台ASUS Memo Pad HD 7.我们测试过的其他设备(手机和平板电脑)都按照规定的时间间隔收集数据包.
接收数据包的功能如下:
public void run()
{
while (isUDPServerRunning)
{
try
{
socket.receive(packet);
ProcessRawPacketData();
DisplayLoggingInfo();
}
catch (IOException e)
{
Log.e("receive", e.getMessage());
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个部分Runnable.这样创建套接字:
byte[] buffer = new byte[1024];
DatagramSocket socket;
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
Run Code Online (Sandbox Code Playgroud)
在onCreate()我们的Service扩展方法中初始化套接字:
socket = new DatagramSocket(SERVERPORT);
Run Code Online (Sandbox Code Playgroud)
Wifi模块正在接收数据包.我们已经确认通过生根其中一个设备并安装数据包嗅探器,因此问题必须以某种方式与代码相关.
在受影响的设备上,数据包被正确接收几秒钟,然后完全丢失持续几秒钟,因此我估计损失超过50%.
任何帮助将非常感激.我们正在拔头发.
更新我错误的数据包嗅探器.似乎数据包嗅探器也在root设备上丢失了几个相关的数据包.但有时候,只需启动数据包嗅探器即可解决问题!如下所示打开/关闭蓝牙似乎没有什么区别.这可能是另一个硬件问题吗?
更新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: …Run Code Online (Sandbox Code Playgroud) 我最近在我的 Android(特别是 2.3.3 和 4.0.4)应用程序中实现了 UDP 数据包排序支持,该应用程序在设备之间广播 UDP 数据包。排序支持基本上采用任何字节 [] 并将其分成 UDP 友好的大小,并将它们作为 UDP 数据包发送出去。我包含一个有助于 UDP 序列识别的标头。现在看来,通过它广播大型数据集是可行的。任何侦听它的对等方都可以很好地重新组装序列,然后相应地处理数据。(我正在播放用相机拍摄的图像和语音片段)
但我发现序列中的数据包偶尔(经常)会被丢弃。在有人说 UDP 不可靠之前,请不要打扰。我很清楚。这里发生的事情并不一定是不可靠的。
首先,UDP 数据包排序将每 2 秒发出 1 个分段的 UDP 数据包。例如,如果数据为 128K,则会有 3 个数据包,在 6 秒内发送出去。2秒数字是为了帮助测试。
其次,我的隔离测试环境中只有 2 台设备。他们是测试 wifi 网络上唯一的人。
第三,这些设备除了测试发送和接收这些 UDP 数据包之外什么也不做。
第四,我的日志记录跟踪每个数据包的基于唯一序列的 ID。它有助于确定发送方按顺序发送了哪些数据包以及接收方收到了哪些数据包。
我无法向您显示日志,这没有帮助,但发送者会注意到每个数据包都已被广播,而接收者可能会在任何时候丢弃一个数据包。有时接收者会收到所有内容,有时会丢失一个。
现在我已经解释了所有这些,Android 队列是否收到处理套接字的 UDP 数据包?
我不认为接收方太忙而无法接受 UDP 数据包。(每 2 秒发送一次)
目前,我的服务启动了一个 Runnable,它基本上在 DatagramSocket.receive() 上循环,然后相应地处理接收到的数据包。
public class MulticastListenerRunnable implements Runnable {
...
public void run() {
try {
multicastServer = new DatagramSocket(port, null);
byte[] buffer = new byte[DatagramSession.DATAGRAM_MAX_SIZE]; …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过专用网络上的UDP广播,通过WiFi将多声道音频从一台服务器发送到多台客户端计算机.
我使用名为Pure Data的软件,使用名为netsend~和netreceive~的UDP广播工具.代码在这里:http: //www.remu.fr/sound-delta/netsend ~/
简而言之,我能够在点对点网络中向一台客户端计算机发送9个频道,但是当我尝试向2个客户端播放广播时(尚未尝试更多),我得到了没有声音.我可以压缩音频,并通过UDP广播将4个压缩的信道(大约10%未压缩的大小)成功发送到2个客户端.或者我可以通过UDP广播向1个客户端发送1个频道,但有一些故障.
WiFi路由器是Linksys WRT300N.所有计算机都运行Windows XP.IP地址为192.168.1.x,子网掩码为255.255.255.0,子网广播地址为192.168.1.255.
我很好奇 - 路由器中的UDP广播包会发生什么?如果我的子网掩码为255.255.255.0,那么路由器是否会为广播地址发送的每个数据包生成254个数据包?
我的WiFi带宽至少为100Mbps,但我似乎无法通过UDP广播向多个客户端发送超过10Mbps的音频.
是什么阻止我将音频发送到WiFi的带宽限制?
有关套接字代码修改,网络设置,路由器设置,子网修改的任何建议......非常感谢!
谢谢尼克