w dowolny sposób, aby odkryć urządzenia z Androidem w sieci?
Chcę móc odkrywać urządzenia z Androidem w mojej sieci i być może pobierać informacje o nich. Jest to bardzo proste w urządzeniach Apple, ponieważ uruchamiają usługi Bonjour. Jednak nie mogę znaleźć podobnej usługi działającej na Androidzie.
Musi to działać bez modyfikowania urządzenia z systemem Android, instalowania niektórych usług lub otwierania niektórych portów. Jest przeznaczony do pracy z waniliowymi urządzeniami z systemem Android w taki sposób, w jaki Bonjour pomaga znaleźć waniliowe urządzenia Apple. Wystarczy nawet sprawdzenie, czy urządzenie działa pod kontrolą systemu Android.
Wybrana odpowiedź: Chociaż nie jest to najwyżej oceniona odpowiedź (jeszcze), spójrz na odpowiedź Luisa. Jak wspomina, możesz użyć wyszukiwania DNS (za pomocą lokalnego serwera DNS), aby odkryć urządzenia z Androidem. Odkryłem, że ma to 100% wskaźnik sukcesu, ponieważ Android zmusza urządzenia do używania nazwy hosta android-_____. Jest to najwyraźniej trudne do zmiany w telefonie, nawet jeśli jest zakorzenione. Myślę, że to dość dokładna metoda. Dzięki, Luis!
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.
Przykładowy kod: Jeśli chcesz zaimplementować to w Javie (np. Uruchomić na Androidzie), nie możesz łatwo użyć getHostName (), ponieważ korzysta z zewnętrznych serwerów DNS. Na przykład chcesz użyć lokalnego serwera DNS na routerze. Luis wspomina poniżej, że możesz zmodyfikować serwery DNS połączenia Wi-Fi, ale może to spowodować złamanie innych rzeczy. Zamiast tego znalazłemdnsjava
biblioteka, która będzie niezwykle pomocna w wysyłaniu ukierunkowanych żądań DNS Oto przykładowy kod korzystający z biblioteki:
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);
}
To daje mi dane wyjściowe:
DNS Record: android-711c129e251f14cf.\001.
Bingo.