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-сети?

спасибо и рассматривает

Ответ 1

Вы почти правы, по умолчанию 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

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

Ответ 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.

Ответ 4

Хотя это старый вопрос, но это может кому-то помочь. Это вернет IP-адрес вашего устройства, если вы включили горячую точку.

private String getIpAddress() {
    String ip = "";
    try {
        Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
                .getNetworkInterfaces();
        while (enumNetworkInterfaces.hasMoreElements()) {
            NetworkInterface networkInterface = enumNetworkInterfaces
                    .nextElement();
            Enumeration<InetAddress> enumInetAddress = networkInterface
                    .getInetAddresses();
            while (enumInetAddress.hasMoreElements()) {
                InetAddress inetAddress = enumInetAddress.nextElement();

                if (inetAddress.isSiteLocalAddress()) {
                    ip += "SiteLocalAddress: "
                            + inetAddress.getHostAddress() + "\n";
                }
            }
        }

    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        ip += "Something Wrong! " + e.toString() + "\n";
    }
    return ip;
}

Ответ 5

Я также проверил несколько устройств, все устройства имеют один и тот же IP, который является 192.168.43.1, вы можете попробовать этот адрес, но в Android пирог он становится 192.168.43.68

Ответ 6

откройте termux и запустите

pkg install net-tools
ifconfig -a | grep 192.168.43.

вы получите это:

        inet 192.168.43.248  netmask 255.255.255.0  broadcast 192.168.43.255