¿Por qué la recepción de multidifusión no funciona en algunos dispositivos Android?
Parece que la recepción de multidifusión no funciona en algunos dispositivos Android. No puedo recibir multicast con 4 de los 13 dispositivos de prueba. En esos 4 dispositivos parece que la aplicación no envía la solicitud IGMP para unirse al grupo de multidifusión.
El código para recibir la multidifusión se ve así:
- ¿Cómo crear XWalkWebResourceResponse?
- Android, http: ¿Cómo subir un archivo a un sitio alojado por un servidor compartido?
- Temas y contribuciones para Volley
- ¿Qué causa "java.io.IOException: se restableció el flujo: CANCELAR" con okhttp y spdy?
- Android: NAT Traversal?
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();
La aplicación tiene los siguientes permisos:
<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"/>
Para demostrar el problema he creado un pequeño proyecto de prueba utilizando el código anterior en GitHub: MulticastTest .
¿Hay algún problema con mi código? ¿Extraño un permiso?
EDIT 1 : Este problema no parece estar relacionado con una versión específica de Android. Puedo reproducir el comportamiento en Android 4.x, 5.xy 6.x.
EDIT 2 : Hay una pregunta relacionada.
- GetAllNetworkInterfaces () lanza la excepción
- Conecte Eclipse al emulador de Android en una máquina diferente
- HttpClient de Android que envía la petición a la máquina de anfitrión sobre USB
- Capturar el tráfico del teléfono móvil en wireshark
- Cómo tratar los problemas de la red
- Conecte el androide al LAN local vía el teléfono (sobre wifi O vía la conexión del USB)
- UnityWebRequest Incorporación de datos de usuario y contraseña para la autenticación HTTP básica que no funciona en Android
- Android, NetworkInfo.getTypeName (), NullpointerException
Malas noticias: Esto parece estar relacionado con los dispositivos afectados. No hay /proc/net/igmp
disponible exactamente en aquellos dispositivos que no pueden recibir el tráfico de multidifusión. Como ya se esperaba, esto lleva muy probablemente a la petición de grupo de IP_ADD_MEMBERSHIP
( IP_ADD_MEMBERSHIP
).
Hemos intentado con la API Java de Android, los zócalos BSD y Boost.Asio. El mismo resultado con las tres opciones.
Verificamos el problema con una aplicación llamada Multicast Tester . Esta aplicación tiene el mismo problema en los mismos dispositivos que nuestra aplicación. No se envía ninguna solicitud IGMP por el dispositivo y, por supuesto, no se recibe tráfico de multidifusión.
Hay algunos problemas abiertos y cerrados (con status Obsolete y WrongForum) en el rastreador de problemas de Android. Creo que los problemas cerrados están marcados como Obsolete / WrongForum porque no es un problema en Android, pero específico para los dispositivos afectados (configuración).
Parece que el kernel en los dispositivos afectados fue construido con
CONFIG_IP_MULTICAST=n
En el archivo de configuración del kernel . Es también por eso que /proc/net/igmp
no está disponible en los dispositivos afectados. Obviamente, sólo se crea cuando CONFIG_IP_MULTICAST
se establece como se puede ver en el código del kernel de Linux .
- Resources.getIdentifier (), valores posibles del argumento deftype?
- Esporádico IllegalArgumentException: Desconocido Contenido de URL: //