Я хочу иметь возможность обнаруживать устройства Android в своей сети и, возможно, получать информацию о них. Это очень легко с устройствами Apple, поскольку они запускают службы Bonjour. Тем не менее, я не могу найти какой-либо подобный сервис, работающий на Android.
Это должно работать без изменения устройства Android, установки некоторой службы или открытия некоторого порта. Он предназначался для работы с мобильными телефонами на базе Android, таким образом, что Bonjour помогает вам находить устройства Apple в ваниле. Даже быть в состоянии просто проверить, что устройство работает под управлением Android, будет достаточно.
Выбранный ответ. Хотя это не самый рейтинговый ответ (пока), пожалуйста, взгляните на ответ Луиса. Как он упоминает, вы можете использовать поиск DNS (используя свой локальный DNS-сервер) для обнаружения устройств Android. Я обнаружил, что у этого есть 100% -ный шанс успеха, поскольку Android заставляет устройства использовать имя хоста android- _____. Это, по-видимому, трудно изменить по телефону, даже если оно коренится. Поэтому я считаю, что это довольно точный метод. Спасибо, Луис!
Example:
$ nslookup 192.168.1.104 192.168.1.1
Server: 192.168.1.1
Address: 192.168.1.1#53
104.1.168.192.in-addr.arpa name = android-711c129e251f14cf.\001.
Пример кода: Если вы хотите реализовать это на Java (например, для запуска на Android), вы не можете легко использовать getHostName(), потому что он использует внешние DNS-серверы. Например, вы хотите использовать локальный DNS-сервер на вашем маршрутизаторе. Луис упоминает ниже, что вы можете изменить DNS-серверы Wifi-соединения, но это может привести к нарушению других вещей. Вместо этого я нашел библиотеку dnsjava
чрезвычайно полезной для отправки целевых DNS-запросов. Вот пример кода с помощью библиотеки:
String ipAddress = "104.1.168.192";
String dnsblDomain = "in-addr.arpa";
Record[] records;
Lookup lookup = new Lookup(ipAddress + "." + dnsblDomain, Type.PTR);
SimpleResolver resolver = new SimpleResolver();
resolver.setAddress(InetAddress.getByName("192.168.1.1"));
lookup.setResolver(resolver);
records = lookup.run();
if(lookup.getResult() == Lookup.SUCCESSFUL) {
for (int i = 0; i < records.length; i++) {
if(records[i] instanceof PTRRecord) {
PTRRecord ptr = (PTRRecord) records[i];
System.out.println("DNS Record: " + records[0].rdataToString());
}
}
} else {
System.out.println("Failed lookup");
}
} catch(Exception e) {
System.out.println("Exception: " + e);
}
Это дает мне результат:
DNS Record: android-711c129e251f14cf.\001.
Бинго.