2016-05-18 19 views
6

Es scheint, Multicast-Empfang funktioniert nicht auf einigen Android-Geräten. Ich kann Multicast nicht mit 4 von 13 Testgeräten empfangen. Auf diesen vier Geräten scheint die App die IGMP-Anfrage nicht an die Multicast-Gruppe zu senden.Warum funktioniert der Multicast-Empfang auf einigen Android-Geräten nicht?

Der Code der Multicast zu empfangen sieht so aus:

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(); 

Die App verfügt über die folgenden Berechtigungen:

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

das Problem zu demonstrieren ich auf ein kleines Testprojekt mit dem obigen Code erstellt GitHub: MulticastTest.

Gibt es ein Problem mit meinem Code? Vermisse ich eine Erlaubnis?

EDIT 1: Dieses Problem scheint sich nicht auf eine bestimmte Android-Version beziehen. Ich kann das Verhalten auf Android 4.x, 5.x und 6.x reproduzieren.

EDIT 2: Es gibt eine verwandte question.

Antwort

3

Schlechte Nachrichten: Dies scheint mit den betroffenen Geräten zusammenhängen. Es gibt keine /proc/net/igmp, die genau auf den Geräten verfügbar ist, die den Multicast-Datenverkehr nicht empfangen können. Wie bereits erwartet, führt dies sehr wahrscheinlich zu der fehlenden Join-Gruppenanfrage (IP_ADD_MEMBERSHIP).

Wir versuchten mit der Android Java API, BSD Sockets und Boost.Asio. Gleiches Ergebnis mit allen drei Optionen.

Wir haben das Problem mit einer App namens Multicast Tester verifiziert. Diese App hat das gleiche Problem auf den gleichen Geräten wie unsere App. Es wird keine IGMP-Anforderung vom Gerät gesendet, und natürlich wird kein Multicast-Verkehr empfangen.

Es gibt einige offene und geschlossene (mit Status Obsolete und WrongForum) issues im Android Issue Tracker. Ich denke, die geschlossenen Probleme sind als Obsolete/WrongForum markiert, weil es kein Problem in Android, sondern speziell für die betroffenen Geräte (Setup) ist.

Es scheint, dass der Kernel auf die betroffenen Geräte mit

CONFIG_IP_MULTICAST=n 

in der kernel configuration-Datei erstellt wurde. Aus diesem Grund ist /proc/net/igmp nicht auf den betroffenen Geräten verfügbar. Es wird natürlich nur erstellt, wenn CONFIG_IP_MULTICAST gesetzt ist, wie in der Linux kernel code zu sehen ist.