2011-07-01 21 views
13

Mam prototypową aplikację na Androida, która nasłuchuje pakietów multiemisji, aby "odkryć" klientów, z którymi można się komunikować. Konfiguracja gniazda jest podobna do:Obsługa multiemisji w systemie Android w trybie Hotspot/Tethering

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

Działa to bardzo dobrze, gdy wszystkie urządzenia są połączone przez WiFi. Chciałbym to poprzeć, ponieważ telefon działa jak przenośny hotspot. Jednak mimo, że wszystkie moje urządzenia prawidłowo łączą się z hotspotem, nie otrzymuję już danych multiemisji. Zastanawiam się, czy istnieją ograniczenia, które uniemożliwiają tego typu komunikację w trybie hotspot, czy też jest jakaś dodatkowa konfiguracja sieci wymagana do włączenia tego? Próbowałem tego na kilku różnych urządzeniach z Gingerbread i Froyo bez powodzenia.

+1

Chciałbym usłyszeć, jeśli udało Ci się rozwiązać ten problem. Rozumiem, że potrzebujesz multicastlock, aby multicast zadziałał. A jedynym sposobem na zdobycie jednego jest jednak Wifimanager.Niestety z urządzeniem skonfigurowanym jako hotspot wydaje się, że blokada multicastu jest tworzona na interfejsie eth0, podczas gdy faktyczna komunikacja odbywa się w wl0.1 To jest tak daleko, jak mam z tym problemem, nie jestem pewien, czy ". m na właściwym torze. – Petrus

+0

To samo tutaj ....... – zaf

+0

Niemal to samo. Oba urządzenia nadają, ale nie mogą "widzieć" siebie nawzajem. –

Odpowiedz

3

W tym artykule pokazują: https://plus.google.com/+Chainfire/posts/9NMemrKYnCd

MulticastSocket: : setNetworkInterface()

będzie odpowiedzią

można znaleźć ETH wlan0 przez:

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

Spróbować i lemingi wiem, czy to działa, czy nie w trybie Hotspot ...

0

miałem ten sam problem i wymyślił rozwiązanie przez połączenie @braden, @ user707606 i głównie post przez Chainfire w tym Link.

Opublikuj w linku jest ładne, ale tak naprawdę nie oferuje żadnych próbek kodu, ale tutaj jest. Najpierw musisz zdobyć blokadę multiemisji, która jest potrzebna na niektórych urządzeniach z Androidem, nie próbowała większości z nich, ale została wymieniona w kilku innych postach, więc umieściłem ją w moim kodzie.

Pozwolenie jest wymagane, więc najpierw dodaj uprawnienia do pliku manifestu.

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

Następnie drugim krokiem jest uzyskanie blokady multiemisji w swojej metodzie.

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

A potem, znajdź swój Wifi sieciowa

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

Później utworzenia gniazda Multicast z wolnego portu i ustawić Wifi NetworkInterface.

MulticastSocket multicastSocket = new MulticastSocket(); 

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

Następnie pozostała część implementacji pozostanie niezmieniona. A kiedy skończysz z funkcją Multicast Lock, zalecane jest jej zwolnienie.

Powiązane problemy