2011-07-01 8 views
13

ho un prototipo di applicazione Android che è in ascolto per i pacchetti multicast a 'scopri' i clienti di comunicare con. La presa set up è simile a questo:supporto multicast su Android in modalità/Tethering tramite hotspot

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

Questo funziona molto bene quando tutti i dispositivi sono collegati tramite WiFi. Vorrei sostenere questo con il telefono che funge da hotspot portatile. Tuttavia, mentre tutti i miei dispositivi sembrano connettersi correttamente all'hotspot, non ricevo più dati multicast. Mi chiedo se esistono restrizioni che non consentono questo tipo di comunicazione in modalità hotspot o se sono necessarie ulteriori configurazioni di rete per abilitare questo? Ho provato questo su un paio di dispositivi diversi che eseguono Gingerbread e Froyo senza fortuna.

+1

Mi piacerebbe sapere se siete riusciti a risolvere questo problema. Il modo in cui ho capito è che hai bisogno di un multicastlock per far funzionare il multicast. E l'unico modo per acquisirne uno è il wifimanager.Sfortunatamente, con il dispositivo impostato come hotspot, sembra che il blocco multicast sia stato creato sull'interfaccia eth0, mentre la comunicazione effettiva sta accadendo a wl0.1 Questo è quanto ho avuto con questo problema, non sono sicuro che io sia " m sulla strada giusta. – Petrus

+0

Lo stesso qui ....... – zaf

+0

Praticamente la stessa cosa qui. Entrambi i dispositivi stanno trasmettendo, ma non possono "vedersi" a vicenda. –

risposta

3

Come questo articolo spettacolo: https://plus.google.com/+Chainfire/posts/9NMemrKYnCd

MulticastSocket: : setNetworkInterface()

sarebbe la risposta

è possibile trovare il Politecnico federale di wlan0 da:

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; 
} 

avere una prova e fammi sapere se funziona o no in modalità Hotspot ...

0

Ho avuto lo stesso problema e si avvicinò con una soluzione dalla combinazione di @braden, @ user707606 e principalmente palo da Chainfire in questo Link.

Share link è bello, ma in realtà non offre alcun esempi di codice, ma qui è. Per prima cosa devi acquisire Multicast Lock, questo è necessario per alcuni dispositivi Android, non è stato provato nella maggior parte di essi, ma è stato menzionato in altri post, quindi l'ho incluso nel mio codice. è richiesto

permesso, quindi prima, aggiungere i permessi nel file manifesto.

<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" /> 

Quindi il secondo passaggio consiste nell'acquisizione del blocco multicast nel metodo.

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

E poi, trova le informazioni di interfaccia di rete 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; 
} 

In seguito, creare un socket multicast con una porta e impostare il Wifi NetworkInterface.

MulticastSocket multicastSocket = new MulticastSocket(); 

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

Quindi il resto della vostra implementazione rimane lo stesso. E una volta che hai finito con Blocco Multicast, è consigliabile rilasciarlo.