Soporte de multidifusión en Android en modo Hotspot / Tethering

Tengo un prototipo de aplicación para Android que está escuchando paquetes de multidifusión para "descubrir" a los clientes con los que comunicarse. La configuración del socket es similar a esto:

InetAddress group = InetAddress.getByName("228.1.2.3"); MulticastSocket s = new MulticastSocket(4000); s.joinGroup(group); 

Esto funciona muy bien cuando todos los dispositivos están conectados vía WiFi. Me gustaría apoyar esto con el teléfono que actúa como un hotspot portátil. Sin embargo, aunque todos mis dispositivos parecen conectarse correctamente al hotspot ya no recibo datos de multidifusión. Me pregunto si hay restricciones que no permiten este tipo de comunicación en modo hotspot, o si hay alguna configuración de red adicional necesaria para habilitarlo? He probado esto en un par de dispositivos diferentes que ejecutan Gingerbread y Froyo sin suerte.

Como se muestra en este artículo: https://plus.google.com/+Chainfire/posts/9NMemrKYnCd

MulticastSocket :: setNetworkInterface ()

Sería la respuesta

Usted puede encontrar el wlan0 eth por:

 public static NetworkInterface getWlanEth() { Enumeration<NetworkInterface> enumeration = null; try { enumeration = NetworkInterface.getNetworkInterfaces(); } catch (SocketException e) { e.printStackTrace(); } NetworkInterface wlan0 = null; StringBuilder sb = new StringBuilder(); while (enumeration.hasMoreElements()) { wlan0 = enumeration.nextElement(); sb.append(wlan0.getName() + " "); if (wlan0.getName().equals("wlan0")) { //there is probably a better way to find ethernet interface Log.i(TAG, "wlan0 found"); return wlan0; } } return null; } 

Tener un intento y lemme saber si funciona o no en el modo Hotspot …

¿Tiene el permiso de manifiesto y está creando un bloqueo?

Para obtener permiso, consulte: 'CHANGE_WIFI_MULTICAST_STATE' en http://developer.android.com/reference/android/Manifest.permission.html

Además, para crear un bloqueo de multidifusión … consulte: http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html

He tenido el mismo problema y se me ocurrió una solución por la combinación de @braden, @ user707606 y principalmente el puesto de Chainfire en este enlace .

Publicar en el enlace es bueno, pero realmente no ofrece ningún código de muestra, pero aquí está. Primero necesitas adquirir Multicast Lock, esto es necesario para algunos dispositivos Android, no lo probaste en la mayoría de ellos, pero fue mencionado en algunos otros posts, así que lo he incluido en mi código.

El permiso es necesario, así que primero, agregue los permisos en su archivo de manifiesto.

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

Entonces el segundo paso es adquirir el bloqueo de multidifusión en su método.

 /* Acquire MultiCast Lock */ WifiManager wifi = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock"); multicastLock.setReferenceCounted(true); multicastLock.acquire(); 

Y luego, encuentre su interfaz de red Wifi

 /** * Finds Network Interface of Wifi Ethernet. * * @return */ public static NetworkInterface findWifiNetworkInterface() { Enumeration<NetworkInterface> enumeration = null; try { enumeration = NetworkInterface.getNetworkInterfaces(); } catch (SocketException e) { e.printStackTrace(); } NetworkInterface wlan0 = null; while (enumeration.hasMoreElements()) { wlan0 = enumeration.nextElement(); if (wlan0.getName().equals("wlan0")) { return wlan0; } } return null; } 

Más tarde, cree un socket de multidifusión con un puerto disponible y configure su Wifi NetworkInterface.

 MulticastSocket multicastSocket = new MulticastSocket(); /* Set NetworkInterface of MultiCast Socket */ NetworkInterface wifiNetworkInterface = findWifiNetworkInterface(); if (wifiNetworkInterface != null) multicastSocket.setNetworkInterface(wifiNetworkInterface); 

Entonces el resto de su implementación sigue siendo el mismo. Y una vez que haya terminado con Multicast Lock, se recomienda liberarlo.

  • ¿Cómo depurar Android 6.0 sobre Wi-Fi? (Problema netcfg)
  • ¿Cómo obtener BSSID de todos los puntos de acceso wifi?
  • ¿Cómo obtener la seguridad WiFi (NINGUNA, WEP, WPA, WPA2) de Android WifiConfiguration entrada?
  • Creación de un registro WiFi NDEF utilizando application / vnd.wfa.wsc en Android
  • Servidor y cliente en un dispositivo con WiFi habilitado
  • ¿Cómo hacer un peer androide a peer sin utilizar el servidor intermedio?
  • Conéctese a 802.1x WiFi con una etiqueta NFC
  • Android: Activar / desactivar WiFi Hotspot mediante programación en Android Marshmallow (6.0)
  • Cómo escribir un Android SocketServer para escuchar en wifi
  • Cómo obtener el IP del hotspot wifi en Android?
  • ¿Cómo ser notificado cuando un compañero ya no está disponible en la gama Wi-Fi Direct?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.