2013-03-30 12 views
6

現在、SDK> = 16を使用してアンドロイドアプリを開発しています。これは、WiFiラジオを使用してローカルエリアネットワーク内のさまざまなアンドロイドデバイス(それ以降のiOSデバイス)を検出できるはずです。ローカルネットワークでのデバイス検出

私の最初の推測では、私のSamsung Galaxy S2では機能しないことが判明したマルチキャストを使用していました。パケットは同じデバイスから送信されたときにのみ受信されます。

私の2番目の推測は、限られたIPアドレス範囲を使用してネットワークを積極的にスキャンし、適切な応答を待つことです。残念ながら、これはネットワークがDHCPを使用してIPアドレスをアドレス指定することを意味します。

上記の解決策のどれも完璧な解決策ではないようです。私の最初の推測のための

私の現在のソリューション:ラインsocket.receive(RECV)にブロッキング

public class MulticastReceiver extends AsyncTask<Activity, Integer, String> { 

    private static final String host = "224.1.1.1"; 
    private static final int port = 5007; 
    private static final String TAG = "MulticastReceiver"; 

    protected String doInBackground(Activity... activities) { 
     WifiManager wm = (WifiManager)activities[0].getSystemService(Context.WIFI_SERVICE); 
     WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo"); 
     multicastLock.acquire(); 
     String message = "Nothing"; 

     if (multicastLock.isHeld()) { 
      Log.i(TAG, "held multicast lock"); 
     } 

     try { 
      InetAddress addr = InetAddress.getByName(host); 
      MulticastSocket socket = new MulticastSocket(port); 
      socket.setTimeToLive(4); 
      socket.setReuseAddress(true); 
      socket.joinGroup(addr); 

      byte[] buf = new byte[5]; 
      DatagramPacket recv = new DatagramPacket(buf, buf.length, addr, port); 
      socket.receive(recv); 
      message = new String(recv.getData()); 
      socket.leaveGroup(addr); 
      socket.close(); 
     } catch (Exception e) { 
      message = "ERROR " + e.toString(); 
     } 

     multicastLock.release(); 

     return message; 
    } 
} 

このコードの結果。タイムアウトを指定すると、タイムアウト例外が発生します。

答えて

2

チェックアウトhttp://developer.android.com/training/connect-devices-wirelessly/index.htmlローカルサービスNSDとwifi directの2つの検索方法が記載されています。

+0

ただし、Wi-Fiとは、ローカルネットワークへの接続が失われたことを意味します。私はまだ他のデバイスを発見しながらインターネットにアクセスできるようにしたい。また、テスト目的のために、非アンドロイドOSを実行しているローカルマシンを発見することができればうれしいでしょう。 – anopheles

+0

NSDを試してください。スキャンは方法ではありません、攻撃のように見えるネットワーク管理者に。 –

+1

NSDはフードの中でマルチキャストを使用しませんか? – anopheles

2

私はいくつかのネットワークアプリケーションをコーディングされたときに、マルチキャストはいくつかの時間前に、ギャラクシーS2上で動作していないことを信じていない非常によく似た質問にAndroid Network Discovery Service (ish) before API 14

を私の答えをチェックし、私は多くのデバイス上でいくつかのテストを行い、一部の古いですG1のように、S2、S3、Galaxy Tab 10にも表示されます。

しかし、マルチキャストを使用できるようにするには、プログラムでそれを有効にする必要があります。

このコードを使用しましたか?

WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
if(wifi != null){ 
WifiManager.MulticastLock lock = wifi.createMulticastLock("Log_Tag"); 
lock.acquire(); 
} 
+0

はい、サンプルアプリケーションに上記のコードがあります。元のコメントに完全なコードを掲載します。私は挑戦的に私のネットワーク上の異なるマシン上でマルチキャストが動作することを確認することができますが、私のGalaxy S2は惨めに失敗します:( – anopheles

+0

あなたは2つのアンドロイドデバイスを持っているなら、pttdroid p/pttdroid /とマルチキャストグループにデータ(音声)を送受信するオプションがあります。 – MP23

関連する問題