現在、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;
}
}
このコードの結果。タイムアウトを指定すると、タイムアウト例外が発生します。
ただし、Wi-Fiとは、ローカルネットワークへの接続が失われたことを意味します。私はまだ他のデバイスを発見しながらインターネットにアクセスできるようにしたい。また、テスト目的のために、非アンドロイドOSを実行しているローカルマシンを発見することができればうれしいでしょう。 – anopheles
NSDを試してください。スキャンは方法ではありません、攻撃のように見えるネットワーク管理者に。 –
NSDはフードの中でマルチキャストを使用しませんか? – anopheles