2016-05-18 46 views
6

Çok noktaya yayın alımı bazı Android cihazlarda çalışmaz gibi görünüyor. 13 test cihazından 4'üne multicast alamıyorum. Bu 4 cihazda, uygulama çok noktaya yayın grubuna katılmak için IGMP isteğini göndermiyor gibi görünüyor. çok noktaya yayın almaNeden multicast yayını bazı Android cihazlarda çalışmıyor?

kod şöyle görünür:

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

uygulama aşağıdaki izinlere sahip:

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

Ben yukarıdaki kodu kullanarak küçük bir test projesi oluşturdu sorunu göstermek için GitHub: MulticastTest.

benim koduyla ilgili bir sorun var mı? Bir izni özlüyor muyum?

EDIT 1: Bu sorun, belirli bir Android sürümüyle ilişkili görünmüyor. Davranışı Android 4.x, 5.x ve 6.x'te yeniden oluşturabilirim.

EDIT 2: İlgili bir question var.

cevap

3

Kötü haber: Bu, etkilenen cihazlara bağlantı olabileceği düşünülmektedir. Çok noktaya yayın trafiğini alamayan cihazlarda tam olarak /proc/net/igmp yoktur. Zaten beklendiği gibi bu da büyük olasılıkla birleştirme grubunun isteğine yol açar (IP_ADD_MEMBERSHIP).

Biz Android Java API, BSD soketleri ve Boost.Asio ile çalıştı. Her üç seçenekle aynı sonuç.

Biz Multicast Tester denilen bir uygulama ile sorunu doğrulandı. Bu uygulama, uygulamamızla aynı cihazlarda aynı sorunu yaşıyor. Cihaz tarafından IGMP talebi gönderilmez ve elbette çok noktaya yayın trafiği alınmaz.

bazı açık ve Android sorun izleyicide issues (durumların Eski ve WrongForum ile) kapalı bulunmaktadır. Ben bir Android'de sorun ama etkilenen cihazlar (kurulum) özgü değildir, çünkü kapalı konular/WrongForum olarak Eski işaretlenir düşünüyorum.

O etkilenen cihazlarda çekirdek kernel configuration dosyada

CONFIG_IP_MULTICAST=n 

ile inşa edilmiştir görünüyor. /proc/net/igmp etkilenen cihazlarda kullanılamaz sebeplerinden biri de bu. CONFIG_IP_MULTICASTLinux kernel code de görülebileceği gibi ayarlandığında Açıkçası sadece oluşturulur.