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.

  • Android cómo saber el uso total de datos de Internet por día a través de wifi y móvil
  • Aplicación de Android que no se conecta a Wifi, pero funciona bien en 3G compartida a través de Wifi
  • ¿Permitir que dos dispositivos se vean en Android usando la interfaz wifi?
  • ¿Cómo detectar si el sistema está conectado a wifi ad hoc o de infraestructura?
  • Android se conecta a WiFi sin interacción humana
  • WPS Parámetros Wifi NFC y Android
  • Devolución de llamada en el dispositivo que se conecta a Wifi Hotspot
  • Flujo de Android Wifi
  • Escuchando en un puerto específico para los datos entrantes
  • Hotspot multiplexado en Android
  • ¿Hay una manera de forzar una conexión de red sobre 4G, incluso cuando WiFi está habilitado y conectado?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.