10

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

マルチキャストを受信するコードは次のようになります。

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

私のコードに問題はありますか? 私は許可を逃しますか?

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

EDIT 2 : 関連する質問があります。

4

1 に答える 1

10

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

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

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

Android イシュー トラッカーには、未解決の問題と終了した問題(ステータスが Obsolete および WrongForum) がいくつかあります。Android の問題ではなく、影響を受けるデバイス (セットアップ) に固有の問題であるため、クローズ済みの問題は Obsolete/WrongForum としてマークされていると思います。

影響を受けるデバイスのカーネルは、

CONFIG_IP_MULTICAST=n

カーネル構成ファイルで。/proc/net/igmpこれが、影響を受けるデバイスで が利用できない理由でもあります。明らかに、 Linux カーネル コードCONFIG_IP_MULTICASTで見られるように が設定されている場合にのみ作成されます。

于 2016-05-18T14:39:05.063 に答える