2011-07-01 12 views
13

Tengo un prototipo de aplicación de Android que está escuchando paquetes de multidifusión para 'descubrir' clientes con los que comunicarse. La configuración del socket es similar a esto:Soporte de multidifusión en Android en el modo Hotspot/Tethering

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 a través de WiFi. Me gustaría apoyar esto con el teléfono que actúa como un punto de acceso 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 impidan este tipo de comunicación en el modo de punto caliente, o si hay alguna configuración de red adicional necesaria para habilitar esto. Lo intenté en un par de dispositivos diferentes ejecutando Gingerbread y Froyo sin suerte.

+1

Me encantaría saber si ha logrado resolver este problema. La forma en que lo entiendo es que necesita un multicastlock para que multicast funcione. Y la única forma de adquirir uno es a través de la wifimanager.Desafortunadamente, con el dispositivo configurado como un punto de acceso público, parece que el bloqueo de multidifusión se crea en la interfaz eth0, mientras que la comunicación real está sucediendo en wl0.1. Esto es lo más lejos que tengo con este problema, no estoy seguro de si ' m en el camino correcto. – Petrus

+0

Lo mismo aquí ....... – zaf

+0

Más o menos lo mismo aquí. Ambos dispositivos están transmitiendo, pero no pueden "verse" entre ellos. –

Respuesta

3

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

MulticastSocket: : setNetworkInterface()

sería la respuesta

se encuentra la ETH wlan0 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 una oportunidad y déjame saber si funciona o no en el modo hotspot ...

0

que he tenido el mismo problema y se acercó con una solución mediante la combinación de @braden, @ user707606 y principalmente la publicación de Chainfire en este Link.

Publicar en el enlace es bueno, pero realmente no ofrece ningún ejemplo de código, pero aquí está. Primero necesita Adquirir bloqueo de multidifusión, esto es necesario para algunos dispositivos Android, no lo intenté en la mayoría de ellos, pero se mencionó en algunas otras publicaciones, así que lo he incluido en mi código.

Se requiere permiso, 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" /> 

Luego, 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 entonces, encontrar 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, crear un socket de multidifusión con un puerto disponible y establecer sus Wifi NetworkInterface.

MulticastSocket multicastSocket = new MulticastSocket(); 

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

Luego, el resto de su implementación sigue siendo la misma. Y una vez que haya terminado con bloqueo de multidifusión, se recomienda liberarlo.

Cuestiones relacionadas