В настоящее время я разрабатываю приложение для Android с использованием SDK> = 16, которое должно быть в состоянии обнаружить различные устройства Android (позже также устройства iOS) в локальной сети с использованием радио Wi-Fi.Обнаружение устройств в локальной сети
Мое первое предположение заключалось в использовании многоадресной передачи, которая оказалась недействительной на моей Samsung Galaxy S2: пакеты принимаются только при отправке с того же устройства.
Мое второе предположение - активно сканировать сеть с использованием ограниченного диапазона 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 (ПРИЕМ); Если я укажу тайм-аут, я получаю исключение тайм-аута.
Но wifi direct подразумевает, что вы потеряете соединение с вашей локальной сетью, не так ли? Я все еще хочу иметь доступ к Интернету, открывая другие устройства. Также для целей тестирования было бы неплохо также обнаружить локальную машину, на которой работают не-андроиды. – anopheles
Тогда попробуйте NSD. Сканирование - это не путь, к сетевому администратору это похоже на атаку. –
Не использует NSD многоадресную рассылку под капотом? – anopheles