Android 获取手机WIFI和蜂巢网络的IP以及掩码

  • Post author:
  • Post category:其他


获取手机的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。中间再补上.,就成了最终的掩码。



版权声明:本文为qq_31652941原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。