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.
- Descubrimiento del servicio directo Wifi de Android
- Búsqueda de puntos de acceso Wi-Fi en Android mientras está en modo punto de acceso
- Inicie el navegador predeterminado desde el navegador de portal cautivo de Android (CaptivePortalLogin)
- Aplicación de mapas personalizados en interiores
- Android, cómo manejar el cambio en la red (de GPRS a Wi-fi y viceversa) mientras que el sondeo para los datos
- Impresión Bluetooth y WIFI para Android
- ¿Es posible eliminar los grupos Wifi Direct de Android programados?
- IPhone / Android: ¿Cómo enviar pulsaciones de teclado a la computadora portátil sobre Wifi?
- Reiniciar en modo TCP puerto 5555 se bloquea adb
- WiFi Password: ¿cómo se almacena y dónde?
- Android: Fuerza los datos que se envían a través de radio vs WiFi
- Abrir la aplicación cuando se conecta con wifi
- Detenga la conexión de Android a ciertas redes wifi
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.
- Inesperado resultados diferentes de la misma entrada de cadena
- Relleno superior / inferior para Spinner