我正在尝试使用我的Android应用程序在本地网络上接收多播数据包。变送器以两种不同的数据模式运行。
在两种模式下,数据每半秒传输一次。
在一种模式下,输出数据包大约为2675字节。在此模式下,我收到100%的传输数据包。
在另一种模式下,输出数据包大约为50216字节。在这种模式下,我很少收到数据包(98%的数据包丢失)。
在同一网络上使用Linux PC时,我运行python脚本来接收多播,并在两种模式下接收100%的数据包。这意味着问题是我的Android设备本地而不是网络。
有人可以提出这个问题的原因和解决方案吗?我的代码的相关部分如下:
@Override
public void onResume() {
super.onResume();
new Thread(new MulticastRx()).start();
}
class MulticastRx implements Runnable {
@Override
public void run() {
try {
final WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
final String multicastLockName = "MY_LOCK";
WifiManager.MulticastLock multicastLock = null;
if (wifiManager != null) {
multicastLock = wifiManager.createMulticastLock(multicastLockName);
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
} else {
Log.e("TEST", "LOCK FAILED");
}
byte[] recvBuf = new byte[65536];
int port = 11000;
InetAddress group = InetAddress.getByName("224.0.0.1");
MulticastSocket multicastSocket = new MulticastSocket(port);
multicastSocket.joinGroup(group);
Log.d("TEST", "Staring RX Loop");
while (multicastLock!=null && multicastLock.isHeld()) {
DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
multicastSocket.setSoTimeout(10000);
try {
multicastSocket.receive(packet);
mTimeOutDisplayed = false;
String senderIP = packet.getAddress().getHostAddress();
Log.d("TEST", "SENDER:" + senderIP + " -> " +
"Multicast:/" + group + ":" + String.valueOf(port) +
" [" + String.valueOf(packet.getLength()) + "]"
);
} catch (SocketTimeoutException e) {
if (!mTimeOutDisplayed) {
Log.w("TEST", "SocketTimeoutExceptions: " + group);
mTimeOutDisplayed = true;
}
}
}
Log.e("TEST", "Lost Lock");
} catch (Exception e) {
e.printStackTrace();
}
}
}