2012-11-04 44 views
8

Androidクライアントがマルチキャスト(UDP)を使用してIPを交換するチャットアプリケーションを開発しています。Androidデバイスがマルチキャストパッケージを受信して​​いない

すべてのデバイスは、1つの別のスレッドで複数のクライアント(このアプリケーションを実行するすべてのデバイス)にIPを送信します。これらのマルチキャストパケットを受信する別の受信側スレッドが存在します。ここに私のコードです。

//マルチキャストコード。 //レシーバーコード

MulticastSocket socket = new MulticastSocket(9999); 
     InetAddress group = InetAddress.getByName("224.0.0.1"); 
     socket.joinGroup(group); 

     DatagramPacket packet; 

      byte[] buf = new byte[256]; 
      byte b = 'x'; //just a separator for time being 
      Arrays.fill(buf,b); 
      packet = new DatagramPacket(buf, buf.length); 
      String received= ""; 
      while(received!=null) 
      { 
       socket.receive(packet); 
       received = new String(packet.getData()); 
       received = received.substring(0,received.indexOf('x')); 
       this.setIp(received); 
       System.out.println("Address: " + received); 
      } 

     socket.leaveGroup(group); 
     socket.close(); 

DatagramSocket socket = new DatagramSocket(9898); 
      byte buff[] = ip.getBytes(); 
      DatagramPacket packet = new DatagramPacket(buff, buff.length, InetAddress.getByName("224.0.0.1"),9999); 
      socket.send(packet); 
      socket.close(); 

問題は、すべてのデバイスは、自身のアドレスを出力しています。それは他のマルチキャストパッケージを聞くことはないようです(私は他のipも同様に印刷するべきです)。私はまた、それが関連しているかどうか確かでない下のログを取得します。

11-04 23:56:17.985: I/OSNetworkSystem(603): mcastAddDropMembership interfaceIndex=0 

助けてください。

答えて

9

アプリでMulticastLockを取得する必要があります。これにより、ネットワーク上のこのデバイスに明示的に宛先指定されていないパケットを受信することができます。

必要な権限:

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

サンプルコード:

// Acquire multicast lock 
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
MulticastLock multicastLock = wifi.createMulticastLock("multicastLock"); 
multicastLock.setReferenceCounted(true); 
multicastLock.acquire(); 

//Do some mutlicast job here 
... ... 

// Once your finish using it, release multicast lock 
if (multicastLock != null) { 
    multicastLock.release(); 
    multicastLock = null; 
} 
+0

これが唯一の無線LANマルチキャストパケットのためであるように見えます。私はインターネット経由でマルチキャストしています(通常のAPN、WIFIは使用しません)。それはまだ動作しますか? –

+0

私はAndroid上では可能ではないと思います。答えは[こちら](http://stackoverflow.com/questions/3068497/udp-multicast-over-the-internet)が役立つかどうかをご覧ください。 – yorkw

+0

ありがとう私は見てみましょう。 –

1

アンドロイドでIPv4マルチキャストサポートをpoorely実現されます。カップケーキ時代のバグがまだ残っています。

私は同様の問題に遭遇しました。私は、サービス発見のためのmDNS /マルチキャストに依存したプロジェクトを行っていました。私のAndroidアプリはマルチキャストグループに加入していないだけです。私は、Ubuntu 14.04マシンにポータブルアクセスポイントを作成し、tcpdumpを実行することでこれを確認しました。それに接続されたAndroidデバイスは、グループへの参加に必要なIGMPメッセージを送信しませんでした。私はパケットを送信することはできますが、受信することはできません。

私はネットワークに参加するたびに、すべてのシステムにIPv6参加グループメッセージを取得していたことに気付きました。これでIPv6マルチキャストアドレスを試してみると、うまくいきました。

新しいアンドロイドデバイスは、組み込みで必須のマルチキャストをサポートするIPv6をサポートしています。したがって、Class 4 IPv4マルチキャストアドレスを使用する代わりに、IPv6アドレスを使用するようにコードを変更してください。これにより、コードが少なくともローカルレベルで動作するようになります。

http://developer.android.com/reference/java/net/Inet6Address.html

このページでは、IPは、ニーズごとに使用するかについての豊富な情報を持っています。

何人かは、WiFiManager.crrateMulticastLock()がなければ動作すると言いますが、試していません。

グローバルネットワークへのマルチキャストは、確かに理論的に可能です。しかし、私はそれを成功させる実用的な実装を見たことがありません。秘密のルータとファイアウォールがすべて存在していることを考えると、

これはデスクトップ上でどのように行われるかを示しています。同様のコードはAndroidでも動作します。

IPv6 Multicast example

関連する問題