10

似乎多播接收在某些 Android 设备上不起作用。13 台测试设备中有 4 台无法接收多播。在这 4 台设备上,该应用似乎没有发送 IGMP 请求以加入多播组。

接收多播的代码如下所示:

WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiManager.WifiLock wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, TAG);
WifiManager.MulticastLock multicastLock = wifiManager.createMulticastLock(TAG);
multicastLock.setReferenceCounted(true);

wifiLock.acquire();
multicastLock.acquire();

try {
    MulticastSocket socket = new MulticastSocket(32123);

    InetAddress group = InetAddress.getByName("224.1.2.3");
    socket.joinGroup(group);

    DatagramPacket packet;
    byte[] buf = new byte[256];
    packet = new DatagramPacket(buf, buf.length);

    socket.receive(packet);

    socket.leaveGroup(group);
    socket.close();
} catch (IOException e) {
    e.printStackTrace();
}

multicastLock.release();
wifiLock.release();

该应用程序具有以下权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>

为了演示这个问题,我使用 GitHub 上的上述代码创建了一个小测试项目:MulticastTest

我的代码有问题吗?我错过了许可吗?

编辑 1:这个问题似乎与特定的 Android 版本无关。我可以在 Android 4.x、5.x 和 6.x 上重现该行为。

编辑 2:有一个相关的问题

4

1 回答 1

10

坏消息:这似乎与受影响的设备有关。/proc/net/igmp在那些无法接收多播流量的设备上没有可用的确切信息。正如已经预料的那样,这很可能导致缺少加入组请求 ( IP_ADD_MEMBERSHIP)。

我们尝试使用 Android Java API、BSD 套接字和 Boost.Asio。所有三个选项的结果相同。

我们使用名为Multicast Tester的应用程序验证了该问题。此应用在与我们的应用相同的设备上存在相同的问题。设备没有发送任何 IGMP 请求,当然也没有接收到多播流量。

Android 问题跟踪器中有一些打开和关闭(状态为 Obsolete 和 WrongForum)的问题。我认为已关闭的问题被标记为过时/错误论坛,因为它在 Android 中不是问题,而是特定于受影响的设备(设置)。

受影响设备上的内核似乎是用

CONFIG_IP_MULTICAST=n

内核配置文件中。这也是/proc/net/igmp受影响设备上不可用的原因。显然,它仅在设置时创建,如Linux 内核代码CONFIG_IP_MULTICAST中所见。

于 2016-05-18T14:39:05.063 回答