Пытался сделать домашнее задание, но не могу понять это.Получить хост ip android
Я создаю приложение, которое будет работать на телефоне, который подключается к моему домашнему Wi-Fi 24/7. Я хочу, чтобы он обнаружил IP-адрес хоста и отслеживал любые изменения, но я не могу заставить код работать. Я нашел класс InetAddress, который кажется мне тем, что мне нужно, но следующий код генерирует общее исключение «что-то плохое идет не так», я не знаю, как его закрепить, поскольку его не исключение UnknownHostException, которое метод выбрасывает документация:
public void getIP(View view) {
isNetOK();
getLocalIpAddress();
}
public void isNetOK() {
//get connectivity manager
connMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
//call getActiveNetworkInfo method of connMan, returns a networkInfo object
NetworkInfo netInfo = connMan.getActiveNetworkInfo();
if (netInfo !=null && netInfo.isConnected()) {
setViewText("net_stat", "Network Connected");
netOK = true;
} else {
setViewText("net_stat", "Network Unavailable");
}
}
public void getLocalIpAddress() {
isNetOK();
if (netOK) {
try{
InetAddress ownIP = InetAddress.getLocalHost();
localIP = ownIP.toString();
}catch (UnknownHostException e){
setViewText("ip_view", "Error: unknown host");
} catch (Exception ex) {
setViewText("ip_view", "Something bad is going wrong");
}
}
isNetOK работает нормально, я звонил отдельно, в течение дня или около того.
Может кто-нибудь указать, почему этот код не будет работать? Это лучший подход? Моя цель - связать сервер дома с доменным именем, которое я получил в GoDaddy. Мой IP-адрес динамичен, но меняется только каждые несколько месяцев или когда питание отключается. Я хочу приложение, которое может проверять ip один раз и время (6 часов?) И уведомлять меня, если оно изменится, поэтому я могу обновить DNS. Я знаю, взломанный и медленный, и т. Д., Но его действительно просто для частного использования и для того, чтобы я мог заставить его работать.
EDIT 1
Я попробовал метод в ответ budcopter в поле ниже, и, наконец, получил некоторый код, работающий с некоторыми изменениями: длинный
public void getLocalIpAddress() {
if (netOK) {
try{
WifiManager WiMan = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = WiMan.getConnectionInfo();
int address = wifiInfo.getIpAddress();
String ipAddress = (String) Integer.toString(address);
setViewText("ip_view", ipAddress);
} /*catch (UnknownHostException e){
setViewText("ip_view", "Error: unknown host");
} */catch (Exception ex) {
setViewText("ip_view", "Something bad is going wrong");
}
}
Это возвращает действительный Int, десять цифр. Однако, когда я проверяю его на whatismyip.com, они даже не близки к тому, чтобы быть одинаковыми. Локальный адрес телефона - 192.168.1.110, наш внешний ip - 75.xx.xx.xxx, возвращаемый int - 1812048064. Этот же номер возвращается, даже если я активирую радио WiFi. Любая идея, какой номер дает мне система WifiManager?
Кроме того, я добавлю чек, чтобы предотвратить запрос адреса, если WiFi отключен, но в данный момент это тривиально.
Это не решит вашу проблему в любом случае, так как телефон не знает маршрутизатора ** внешний ** IP-адрес и ** не может знать это **, не спрашивая маршрутизатор или что-то снаружи. В принципе, вам понадобится программный эквивалент попадания на один из этих сайтов поиска IP. Возможно, вам будет проще запускать настраиваемую службу на самом маршрутизаторе. –
Спасибо, Крис Страттон. Любая идея, что код возвращается? Я рассмотрю другие варианты, я попытался настроить телефон на DMZ через маршрутизатор, без изменений. Я понимаю, что вы говорите, я начну искать программные инструменты через один из этих сайтов, я не знаю, как заставить мою программу взаимодействовать с простым устройством Wi-Fi-маршрутизатора. –
DMZ ничего не изменит, потому что телефон по-прежнему получает трафик через локальную сеть. Я на самом деле предлагал больше поставить демон publish-ip-update на маршрутизаторе, а не на телефон. Если маршрутизатор или кабельный модем имеет веб-страницу статуса, возможно, вы могли бы соскрести его с телефоном и искать внешний, который он получает от восходящего DHCP-сервера. Конечно, если вы находитесь за несущим NAT, это не будет внешний вид. –