Android Multicast Receiver仅对小包有效

时间:2017-01-10 05:02:08

标签: java android sockets networking multicast

我正在尝试使用我的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();
        }
    }
}

0 个答案:

没有答案