2013-06-25 3 views
10

настоящее время я используюAndroid прибудет IP-адрес точки доступа, обеспечивающее устройство

public static String getLocalIPAddress(WifiManager wm){ 
    return Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress()); 
} 

, чтобы получить IP-адрес, исполняющие устройства. Это прекрасно работает, если устройство подключено к «общей» wlan-сети, а устройство подключено к сети Wi-Fi, которая размещается другим устройством Android через точку доступа. Если устройство не подключено к какой-либо сети Wi-Fi, возвращается «0.0.0.0» (правильно). Но если устройство размещает Wi-Fi-сеть, предоставляя горячую точку, метод все равно возвращает «0.0.0.0». Как я могу получить реальный IP-адрес устройства, предоставляющего горячие точки, в своей собственной Wi-Fi-сети?

ТНХ & рассматривает

ответ

21

Вы почти правы, IP-адрес по умолчанию точки доступа является 192.168.43.1 (Если устройство производитель не изменилось.)

Вы можете проверить исходный код рамки Android (AOSP).

/frameworks/base/services/java/com/android/server/connectivity/Tethering.java /frameworks/base/wifi/java/android/net/wifi/WifiStateMachine.java

В Tethering.java,

private static final String USB_NEAR_IFACE_ADDR  = "192.168.42.129"; 
private static final int USB_PREFIX_LENGTH  = 24; 

// USB is 192.168.42.1 and 255.255.255.0 
// Wifi is 192.168.43.1 and 255.255.255.0 
// BT is limited to max default of 5 connections. 192.168.44.1 to 192.168.48.1 
// with 255.255.255.0 

private String[] mDhcpRange; 
private static final String[] DHCP_DEFAULT_RANGE = { 
    "192.168.42.2", "192.168.42.254", "192.168.43.2", "192.168.43.254", 
    "192.168.44.2", "192.168.44.254", "192.168.45.2", "192.168.45.254", 
    "192.168.46.2", "192.168.46.254", "192.168.47.2", "192.168.47.254", 
    "192.168.48.2", "192.168.48.254", 
}; 

Кроме того, в WifiStateMachine.java

private boolean startTethering(ArrayList<String> available) {         

    boolean wifiAvailable = false;                

    checkAndSetConnectivityInstance();               

    String[] wifiRegexs = mCm.getTetherableWifiRegexs();          

    for (String intf : available) {               
     for (String regex : wifiRegexs) {              
      if (intf.matches(regex)) {               

       InterfaceConfiguration ifcg = null;           
       try {                   
        ifcg = mNwService.getInterfaceConfig(intf);        
        if (ifcg != null) {              
         /* IP/netmask: 192.168.43.1/255.255.255.0 */       
         ifcg.setLinkAddress(new LinkAddress(         
           NetworkUtils.numericToInetAddress("192.168.43.1"), 24));  
         ifcg.setInterfaceUp();             

         mNwService.setInterfaceConfig(intf, ifcg);        
        }                   
       } catch (Exception e) {              
        loge("Error configuring interface " + intf + ", :" + e);     
        return false;                
       }                    

       if(mCm.tether(intf) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {   
        loge("Error tethering on " + intf);          
        return false;                
       }                    
       mTetherInterfaceName = intf;             
       return true;                 
      }                     
     }                      
    }                       
    // We found no interfaces to tether              
    return false;                    
} 

Таким образом, значение по умолчанию равно 192.168.43.1.

+2

это не решает вопрос – Gaucho

+0

@Gaucho Да, он не может решить вопрос, но для этой проблемы нет официального API. Даже при использовании техники отражения практически невозможно получить доступ к этому методу практически на всем устройстве. Поэтому нам нужно выбрать наиболее возможный жесткий IP-адрес. –

+1

@SeongeunSo Значение по умолчанию отлично работает в устройстве motoG, но в нем не меняется. Можете ли вы рассказать мне, как оценить этот ipaddress Wi-Fi? –

10

Я испытал небольшой пару различных устройств и, кажется, что точка доступа устройство обеспечения всегда имеет IP 192.168.43.1 на своей сети. Может кто-нибудь, пожалуйста, проверьте/подтвердите это предположение?

+0

Да, этот IP-адрес по умолчанию указан вами, а также, пожалуйста, [[ pc-through-usb-in-a-background-a/111451? noredirect = 1 # comment145017_111451) – Lucky

+0

Да, это IP-адрес по умолчанию для хот-спота, предоставляющего Android-устройство. –

+0

Да, я проверил несколько устройств. default ip совершенен. – Vrajesh

3

Точка доступа, скорее всего, выступает в качестве сервера DHCP. так,

Чтобы получить IP-адрес (сервер) в Wi-Fi точки доступа после подключения к нему вызвать метод с пультом дистанционного управления (клиента)

intToInetAddress(wifiManager.getDhcpInfo().serverAddress);// get hotspot ip 

затем

public InetAddress intToInetAddress(int hostAddress) { 
    byte[] addressBytes = {(byte) (0xff & hostAddress), 
      (byte) (0xff & (hostAddress >> 8)), 
      (byte) (0xff & (hostAddress >> 16)), 
      (byte) (0xff & (hostAddress >> 24))}; 

    try { 
     return InetAddress.getByAddress(addressBytes); 
    } catch (UnknownHostException e) { 
     throw new AssertionError(); 
    } 
} 

вернет ip-адрес подключенного хот-спота, и да, самый IP-адрес по умолчанию для горячей точки - 192.168.43.1

+3

ОП задал вопрос о локальном IP-адресе Wifi в Hotspot. Вызов 'getDhcpInfo' от клиента не помогает. –