2016-05-18 22 views
6

Wygląda na to, że odbiór multicastowy nie działa na niektórych urządzeniach z Androidem. Nie mogę odbierać multicasta z 4 z 13 urządzeń testowych. Na tych 4 urządzeniach wygląda na to, że aplikacja nie wysyła żądania IGMP, aby dołączyć do grupy multiemisji.Dlaczego odbiór multicastowy nie działa na niektórych urządzeniach z systemem Android?

Kod otrzymywać multicast wygląda tak:

WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE); 
WifiManager.WifiLock wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, TAG); 
WifiManager.MulticastLock multicastLock = wifiManager.createMulticastLock(TAG); 
multicastLock.setReferenceCounted(true); 

wifiLock.acquire(); 
multicastLock.acquire(); 

try { 
    MulticastSocket socket = new MulticastSocket(32123); 

    InetAddress group = InetAddress.getByName("224.1.2.3"); 
    socket.joinGroup(group); 

    DatagramPacket packet; 
    byte[] buf = new byte[256]; 
    packet = new DatagramPacket(buf, buf.length); 

    socket.receive(packet); 

    socket.leaveGroup(group); 
    socket.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

multicastLock.release(); 
wifiLock.release(); 

Aplikacja posiada następujące uprawnienia:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> 

Aby zademonstrować problem stworzyłem mały projekt testowy wykorzystując powyższy kod na GitHub: MulticastTest.

Czy wystąpił problem z moim kodem? Czy brakuje mi pozwolenia?

EDIT 1: Ten problem nie wydaje się odnosić do konkretnej wersji Androida. Mogę odtworzyć zachowanie w systemach Android 4.x, 5.x i 6.x.

EDYCJA 2: Istnieje powiązany question.

Odpowiedz

3

Złe wieści: Wydaje się, że jest to związane z zagrożonymi urządzeniami. Nie ma dostępnych /proc/net/igmp na tych urządzeniach, które nie mogą odbierać ruchu multiemisji. Jak już można się było spodziewać, najprawdopodobniej doprowadzi to do pominięcia prośby o dołączenie do grupy (IP_ADD_MEMBERSHIP).

Próbowaliśmy z Androidem API Java, gniazdami BSD i Boost.Asio. Ten sam wynik dla wszystkich trzech opcji.

Sprawdziliśmy problem z aplikacją o nazwie Multicast Tester. Ta aplikacja ma ten sam problem na tych samych urządzeniach co nasza aplikacja. Żadne żądanie IGMP nie jest wysyłane przez urządzenie i oczywiście nie jest odbierany żaden ruch multiemisji.

Istnieje kilka otwartych i zamkniętych (ze statusami Obsolete i WrongForum) issues w narzędziu do śledzenia problemów z systemem Android. Myślę, że zamknięte problemy są oznaczone jako Obsolete/WrongForum, ponieważ nie jest to problem w systemie Android, ale dotyczy konkretnych urządzeń (konfiguracji).

Wydaje jądro na dotkniętych urządzeń został zbudowany z

CONFIG_IP_MULTICAST=n 

w pliku kernel configuration. Dlatego też /proc/net/igmp nie jest dostępny na zagrożonych urządzeniach. Jest oczywiście tworzony tylko wtedy, gdy ustawiono CONFIG_IP_MULTICAST, co można zobaczyć w Linux kernel code.

Powiązane problemy