为什么多播接收在某些 Android 设备上不起作用?
Why does multicast reception not work on some Android devices?
似乎多播接收在某些 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:有一个相关的 。
坏消息:这似乎与受影响的设备有关。在那些无法接收多播流量的设备上,没有 /proc/net/igmp
可用。正如预期的那样,这很可能导致缺少加入组请求 (IP_ADD_MEMBERSHIP
)。
我们尝试使用 Android Java API、BSD 套接字和 Boost.Asio。所有三个选项的结果相同。
我们使用名为 Multicast Tester 的应用验证了该问题。此应用程序在与我们的应用程序相同的设备上存在相同的问题。设备没有发送 IGMP 请求,当然也没有收到多播流量。
Android 问题跟踪器中有一些打开和关闭(状态为过时和错误论坛)issues。我认为已关闭的问题被标记为 Obsolete/WrongForum,因为它不是 Android 中的问题,而是特定于受影响的设备(设置)。
受影响设备上的内核似乎是用
构建的
CONFIG_IP_MULTICAST=n
在 kernel configuration file. That's also why /proc/net/igmp
is not available on the affected devices. It obviously is only created when CONFIG_IP_MULTICAST
is set as can be seen in the Linux kernel code.
似乎多播接收在某些 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:有一个相关的
坏消息:这似乎与受影响的设备有关。在那些无法接收多播流量的设备上,没有 /proc/net/igmp
可用。正如预期的那样,这很可能导致缺少加入组请求 (IP_ADD_MEMBERSHIP
)。
我们尝试使用 Android Java API、BSD 套接字和 Boost.Asio。所有三个选项的结果相同。
我们使用名为 Multicast Tester 的应用验证了该问题。此应用程序在与我们的应用程序相同的设备上存在相同的问题。设备没有发送 IGMP 请求,当然也没有收到多播流量。
Android 问题跟踪器中有一些打开和关闭(状态为过时和错误论坛)issues。我认为已关闭的问题被标记为 Obsolete/WrongForum,因为它不是 Android 中的问题,而是特定于受影响的设备(设置)。
受影响设备上的内核似乎是用
构建的CONFIG_IP_MULTICAST=n
在 kernel configuration file. That's also why /proc/net/igmp
is not available on the affected devices. It obviously is only created when CONFIG_IP_MULTICAST
is set as can be seen in the Linux kernel code.