私は現在、SDK >= 16 を使用して Android アプリを開発しています。これは、WiFi 無線を使用してローカル エリア ネットワークでさまざまな Android デバイス (後で iOS デバイスも) を検出できるはずです。
私の最初の推測は、Samsung Galaxy S2 で機能しないことが判明したマルチキャストを使用することでした。パケットは、同じデバイスから送信された場合にのみ受信されます。
私の 2 番目の推測は、限られた IP アドレス範囲を使用して積極的にネットワークをスキャンし、適切な応答を待つことです。残念ながら、これはネットワークが DHCP を使用して IP アドレスをアドレス指定していることを意味します。
上記の解決策はどれも完璧な解決策ではないようです。
私の最初の推測に対する私の現在の解決策:
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;
}
}
このコードにより、socket.receive(recv); の行がブロックされます。タイムアウトを指定すると、タイムアウト例外が発生します。