2013-05-02 3 views
0

Пытался сделать домашнее задание, но не могу понять это.Получить хост 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 отключен, но в данный момент это тривиально.

+1

Это не решит вашу проблему в любом случае, так как телефон не знает маршрутизатора ** внешний ** IP-адрес и ** не может знать это **, не спрашивая маршрутизатор или что-то снаружи. В принципе, вам понадобится программный эквивалент попадания на один из этих сайтов поиска IP. Возможно, вам будет проще запускать настраиваемую службу на самом маршрутизаторе. –

+0

Спасибо, Крис Страттон. Любая идея, что код возвращается? Я рассмотрю другие варианты, я попытался настроить телефон на DMZ через маршрутизатор, без изменений. Я понимаю, что вы говорите, я начну искать программные инструменты через один из этих сайтов, я не знаю, как заставить мою программу взаимодействовать с простым устройством Wi-Fi-маршрутизатора. –

+0

DMZ ничего не изменит, потому что телефон по-прежнему получает трафик через локальную сеть. Я на самом деле предлагал больше поставить демон publish-ip-update на маршрутизаторе, а не на телефон. Если маршрутизатор или кабельный модем имеет веб-страницу статуса, возможно, вы могли бы соскрести его с телефоном и искать внешний, который он получает от восходящего DHCP-сервера. Конечно, если вы находитесь за несущим NAT, это не будет внешний вид. –

ответ

0

Попробуйте это:

public void getLocalIpAddress() { 
// remove it, duplicated call 
// isNetOK(); 
if (netOK) { 

    try{ 
     WifiInfo wifiInfo = mWifiManager.getConnectionInfo(); 
     int address = info.getIpAddress(); 

     String ipAddress = Formatter.formatIpAddress(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"); 
     } 

} 

И не забывайте userpermisson в вас androidmainfest.xml:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
+0

Вы уверены, что это будет работа ???? – Piyush

+0

Конечно, я сделал это в своем проекте. Вот исходный код: http: //code.google.com/p/wifi-scanner/source/browse/src/com/shixunaoyou/wifiscanner/wifi/ConnectionInfoDialog.java – buptcoder

+0

У меня возникли проблемы с этим методом.Я не могу найти класс mWifiManager (в eclipse или в документах), но я могу найти WifiManager. Когда я пытаюсь «WifiInfo wifiInfo = WifiManager.getConnectionInfo();» он говорит мне, что не могу статически ссылаться на нестатический метод getConnectionInfo(). –

Смежные вопросы