2016-05-18 18 views
6

一部のAndroid搭載端末でマルチキャスト受信が動作しないようです。 13のテストデバイスのうち4つでマルチキャストを受信することはできません。これらの4つのデバイスでは、マルチキャストグループに参加するためのIGMP要求を送信しないようです。マルチキャストを受信するマルチキャスト受信が一部のAndroid搭載端末で機能しないのはなぜですか?

コードはそうのようになります。

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

アプリ次の権限を持っています

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

私は上記のコードを使用して小さなテストプロジェクトを作成し、問題を実証するためにGitHub:MulticastTest

私のコードに問題はありますか?私は許可を欠場するのですか?

EDIT 1:この問題は特定のAndroidバージョンに関連していないようです。 Android 4.x、5.x、および6.xで動作を再現できます。

編集2:関連がありますquestionがあります。

答えて

3

悪いニュース:これは影響を受けるデバイスに関連しているようです。マルチキャストトラフィックを受信できないデバイスでは、正確に利用できる/proc/net/igmpはありません。すでに予想されているように、これは参加グループのリクエストが不足している可能性が非常に高い(IP_ADD_MEMBERSHIP)。

Android Java API、BSDソケット、Boost.Asioを試しました。 3つのオプションすべてで同じ結果になります。

Multicast Testerというアプリで問題を確認しました。このアプリは、アプリと同じデバイスで同じ問題を抱えています。 IGMP要求はデバイスによって送信されず、もちろんマルチキャストトラフィックは受信されません。

Androidの問題追跡ツールには、開封済み(ステータスがObsoleteおよびWrongForum)のissuesがあります。 Androidでは問題はないが、影響を受けるデバイス(セットアップ)に固有の問題であるため、閉鎖された問題はObsolete/WrongForumとしてマークされていると思います。

影響を受けるデバイス上のカーネルはkernel configurationファイルに

CONFIG_IP_MULTICAST=n 

で構築されたようです。また、影響を受けるデバイスでは/proc/net/igmpが利用できません。明らかに、に見られるようにCONFIG_IP_MULTICASTが設定されている場合にのみ作成されます。

関連する問題