Android 獲取手機WIFI和蜂巢網絡的IP以及掩碼

    獲取手機的IP分爲獲取WIFI無線的IP和數據網絡的IP,其中獲取WiFi的IP其實就是路由IP,手機數據網絡IP則爲運營商基站IP,這個可能會隨着你的移動而不停改變。

同時獲取所有信息

    Android 中提供了方法讓我們可以獲取到當前所有網段的IP以及和IP相關的掩碼信息。以下是獲取wifi和數據網絡ip等相關信息的方法,其中INetAddressInfo爲我自己定義的一個類用於接收信息。

 public static ArrayList<INetAddressInfo> getINetAddressInfo() {
        ArrayList<INetAddressInfo> iNetAddressInfos = new ArrayList<>();
        try {
            Enumeration<NetworkInterface> eni = NetworkInterface.getNetworkInterfaces();
            while (eni.hasMoreElements()) {
                INetAddressInfo iNetAddressInfo = new INetAddressInfo();
                NetworkInterface en = eni.nextElement();
                if (en.isUp() && !en.isLoopback()) {
                    String name = en.getName();
                    if (name.contains("wlan") || name.contains("rmnet")) {
                        List<InterfaceAddress> addresses = en.getInterfaceAddresses();
                        for (InterfaceAddress address : addresses) {
                            InetAddress inetAddress = address.getAddress();
                            String ip = inetAddress.getHostAddress();
                            if (!ip.contains(":")) {
                                iNetAddressInfo.type = name.contains("wlan") ?
                                        INetAddressInfo.TYPE_WIFI : INetAddressInfo.TYPE_MOBILE;
                                iNetAddressInfo.ip = ip;
                                iNetAddressInfo.maskLen = address.getNetworkPrefixLength();
                                iNetAddressInfos.add(iNetAddressInfo);
                            }
                        }
                    }
                }
            }
            return iNetAddressInfos;
        } catch (SocketException ignore) {
            return new ArrayList<>();
        }
    }

    獲取這些信息的核心思想就是通過獲取當前所有網段,然後通過網段關鍵字wlan(表示wifi),rmnet(表示數據網絡)來分別獲取網段信息,從而獲取到IP。當我們其中某個網絡處於斷開狀態時,那麼它便不會獲取到相關信息。

    該方法獲取到的信息,可以在手機的全部參數頁面中查看IP,其中掩碼就是IP後邊緊跟的數據。

這種獲取信息的方法最好在子線程中進行,主線程中偶爾會產生ANR

單獨獲取wifi的IP信息

    可能有時候,我們只想獲取到WiFi的IP信息,那麼可以通過WiFiManager來獲取。

 WifiManager wm = (WifiManager)getApplicationContext().getSystemService(WIFI_SERVICE);
        int netmask = wm.getDhcpInfo().netmask; // 掩碼
        String ip = long2ip(wm.getDhcpInfo().ipAddress);// ip
        Log.d("zzz","netmask = " + netmask + "," + long2ip(netmask) + ",ip = " + ip );
        

    String long2ip(long ip){
        StringBuffer sb=new StringBuffer();
        sb.append(String.valueOf((int)(ip&0xff)));
        sb.append('.');
        sb.append(String.valueOf((int)((ip>>8)&0xff)));
        sb.append('.');
        sb.append(String.valueOf((int)((ip>>16)&0xff)));
        sb.append('.');
        sb.append(String.valueOf((int)((ip>>24)&0xff)));
        return sb.toString();
    }

    通過這種方法獲取到的是ip信息的位數,所以我們需要通過移位轉換一下。

掩碼十進制和位數之間的換算

    掩碼一共有32個,從1開始一直到32。我們平時所見的掩碼格式爲255.255.255.0,這個是掩碼的十進制表示,而在網絡數據傳輸中是二進制傳輸,所以我們也會經常見到掩碼的另一種格式,比如:192.168.0.1/23,其中的23就是掩碼位數,掩碼二進制長度固定爲32位。

1111 1111  1111 1111  1111 1111  1111 1111

    而掩碼規定,掩碼位數必須首位開始前邊連續爲1,後方連續爲0,1的個數不定,可以爲0-32個,所以掩碼也就確定了一共只有32個,因爲只能有32 個1。

192.168.0.1/23

1111 1111 1111 1111 1111 1110 0000 0000
255       255       254       0

    對於255.255.254.0這種格式,其實就是把32個1/0分成四組,每8個一組,計算十進制,例如 1111 1111 就是255。中間再補上.,就成了最終的掩碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章