¿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í:

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.

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 .

  • Jmdns registra en la interfaz IPv4, pero transmite IPv6
  • La pila TCP XBox 360 no responde a sondas TCP Zero Window con una carga útil de 0 bytes
  • ¿Cómo recibir devoluciones de llamada en la pérdida de red para Android Nougat cuando la aplicación está cerrada?
  • Oyente de red Android
  • Phonegap - navigator.connection.type no definido
  • Android: Restablecer programaticamente la señal de red de radio del teléfono
  • Envío de SQLite db al servicio web
  • ¿Cómo obtener la dirección MAC de la interfaz de red WiFi?
  • ¿Cómo puedo comunicarme con un dispositivo Android a través de SSH?
  • Android comprobar la conexión a Internet
  • Sugerencias sobre el desarrollo de juegos multijugador en iOS y Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.