【 Android11 有线网络开发 】网络信息获取、静态IP设置

前言


Android11上WiFi开发前面文章已经做了介绍,本篇将记录以太网的开发过程,以太网的功能需求相对简单。获取网络信息、设置静态和动态IP


相关文章

1、【 Android11 WiFi开发 一 】WiFi列表获取与展示

2、【 Android11 WiFi开发 二 】WiFi连接、断开

3、【 Android11 WiFi开发 三 】WiFi信息获取与静态IP设置


说明


和无线网络中有管理类WifiManager一样,以太网也提供了管理类EthernetManager,获取开关状态、获取以太网络信息、设置动态IP、静态IP获取都通过它,在标准的Android接口中,EthernetManager是隐藏的,所以需要Framework放开,下面就了解相关的API和方法。


实现


1、获取以太网管理类、连接管理类

通过系统服务来获取EthernetManager,在WiFi开发的文章中提到过,连接管理类ConnectivityManager用于获取WiFi的信息。IP地址状态配置使用IpConfiguration,同样适用于以太网。

 
 	val ethernetManager = App.context.getSystemService(EthernetManager::class.java) as EthernetManager

 	val connectivityManager = App.context.getSystemService(ConnectivityManager::class.java) as ConnectivityManager

 	val ipConfiguration = ethernetManager.getConfiguration("eth0")
 

2、获取以太网是DHCP状态

    /**
     * 是否是DHCP
     */
    fun isDHCP(): Boolean {
    	val assignment = ipConfiguration?.getIpAssignment() 
        return assignment == IpConfiguration.IpAssignment.DHCP || assignment == IpConfiguration.IpAssignment.UNASSIGNED
    }


3、获取以太网IP地址


    /**
     * 获取以太网ip地址
     */
    fun getIPAddress(): String? {
        val linkProperties = connectivityManager!!.getLinkProperties(ConnectivityManager.TYPE_ETHERNET)
        linkProperties?.linkAddresses?.forEach {
            if (it.address is Inet4Address) {
                return it.address.hostAddress
            }
        }
        return "0.0.0.0"
    }

3、获取以太网IP地址

   /**
     * 获取以太网-子网掩码
     */
    fun getSubnetMask(): String {
        val networkInfo = connectivityManager?.activeNetworkInfo
        if (networkInfo != null && networkInfo.type == ConnectivityManager.TYPE_ETHERNET) {
            return intToIp(NetworkUtils.prefixLengthToNetmaskInt(getNetworkPrefixLength()))
        }
        return "0.0.0.0"
    }


   	fun intToIp(int paramInt):String {
        return (paramInt & 0xFF) + "." + (0xFF & paramInt >> 8) + "." + (0xFF & paramInt >> 16) + "." + (0xFF & paramInt >> 24);
    }


    private fun getNetworkPrefixLength(): Int {
        var prefixLength = 0
        val linkProperties = connectivityManager!!.getLinkProperties(ConnectivityManager.TYPE_ETHERNET)
        if(linkProperties != null){
            for (linkAddress in linkProperties.linkAddresses) {
                val address: InetAddress = linkAddress.address
                if (address is Inet4Address) {
                    prefixLength = linkAddress.prefixLength
                    break
                }
            }
        }
        return prefixLength
    }
    

4、获取DNS地址

   
    /**
     * 获取DNS Server
     */
    fun getLocalDNS(): String? {
        val linkProperties = connectivityManager!!.getLinkProperties(ConnectivityManager.TYPE_ETHERNET)
        if( linkProperties != null){
            for (dnsServer in linkProperties.dnsServers) {
                if (dnsServer is Inet4Address) {
                    return dnsServer.hostAddress
                }
            }
        }
        return "0.0.0.0"
    }
    

5、获取默认网关


    /**
     * 获取默认网关
     */
    fun getGateway(): String {
        val linkProperties = connectivityManager!!.getLinkProperties(ConnectivityManager.TYPE_ETHERNET)
        if(linkProperties != null){
            var gatewayTemp = linkProperties.routes.toString()
            var gateway = gatewayTemp
            if (gatewayTemp.contains(">")) {
                gatewayTemp = gatewayTemp.substring(gatewayTemp.lastIndexOf('>') + 2, gatewayTemp.length - 1)
                gatewayTemp = gatewayTemp.substring(0, gatewayTemp.length - 5)
            }
            gatewayTemp = gatewayTemp.replace(" eth0", "").trim()
            if(gatewayTemp == "::"){
                gateway = gateway.substring(0,gateway.lastIndexOf(">"))
                gateway = gateway.substring(gateway.lastIndexOf(">") + 2,gateway.length - 1)
                gatewayTemp = gateway.substring(0,gateway.lastIndexOf(" eth0"))
            }
            return if (gatewayTemp.contains("[]")) "" else gatewayTemp
        }
        return "0.0.0.0"
    }
    

上述方法通过ConnectivityManager获取以太网信息,和无线网络类似,类型传ConnectivityManager.TYPE_ETHERNET即可,下面看下设置有线网络DHCP状态。


6、设置动态IP地址


    /**
     * 设置动态获取IP
     */
    fun setWiredWithDhcp(){
        ipConfiguration!!.setIpAssignment(IpConfiguration.IpAssignment.DHCP)
        ethernetManager.setConfiguration("eth0",ipConfiguration)
    }

7、设置静态IP地址

 	/**
     * 有线网络-静态ip设置
     */
    fun setWiredWithStaticIp(dhcp:Boolean,ip: String, mask: String, gateway: String, dns: String):Boolean{
        val staticConfig = StaticIpConfiguration()
        val inetAddress: InetAddress?
        if(!TextUtils.isEmpty(ip) && ip != "0.0.0.0"){
            try {
                inetAddress = NetworkUtils.numericToInetAddress(ip)
            } catch (e: Exception) {
                if(App.DEBUG) Log.i(TAG, "e = ${e.printStackTrace()}")
                return false
            }
        }else{
            return false
        }

        if (!TextUtils.isEmpty(mask) && mask != "0.0.0.0") {
            val networkPrefixLength = parsePrefixLength(mask)
            try {
                staticConfig.ipAddress = LinkAddress(inetAddress, networkPrefixLength)
            } catch (e: Exception) {
                if(App.DEBUG) Log.i(TAG, "e = ${e.printStackTrace()}")
                return false
            }
        }else{
            return false
        }

        if (!TextUtils.isEmpty(gateway) && gateway != "0.0.0.0") {
            try {
                staticConfig.gateway = NetworkUtils.numericToInetAddress(gateway) as Inet4Address
            } catch (e: Exception) {
                if(App.DEBUG) Log.i(TAG, "e = ${e.printStackTrace()}")
                return false
            }
        }else{
            return false
        }

        if (!TextUtils.isEmpty(dns) && dns != "0.0.0.0") {
            try {
                staticConfig.dnsServers.add(NetworkUtils.numericToInetAddress(dns) as Inet4Address)
            } catch (e: Exception) {
                if(App.DEBUG) Log.i(TAG, "e = ${e.printStackTrace()}")
                return false
            }
        }else{
            return false
        }

        if (!TextUtils.isEmpty(dns) && dns != "0.0.0.0") {
            try {
                staticConfig.dnsServers.add(NetworkUtils.numericToInetAddress(dns) as Inet4Address)
            } catch (e: Exception) {
                if(App.DEBUG) Log.i(TAG, "e = ${e.printStackTrace()}")
                return false
            }
        }else{
            return false
        }

        ipConfiguration!!.setStaticIpConfiguration(staticConfig)
        ipConfiguration!!.setIpAssignment(if(dhcp) IpConfiguration.IpAssignment.DHCP else IpConfiguration.IpAssignment.STATIC)
        try {
            ethernetManager.setConfiguration("eth0", ipConfiguration)
        } catch (e: Exception) {
            if(App.DEBUG) Log.i(TAG, "e = ${e.printStackTrace()}")
            return false
        }
        return true
    }


    public static int parsePrefixLength(String netmask) {
        int prefixLength = 0;
        int maskNum = 0x00;
        String[] mask = parseDetailToArray(netmask);

        if (mask.length < 4) return prefixLength;

        for (int i = 0; i < 4; i++) {
            maskNum |= Integer.parseInt(mask[3 - i]) << (i * 8);
        }
        if (maskNum == 0xffffffff) return 32;
        if (maskNum == 0xffffff00) return 24;
        if (maskNum == 0xffff0000) return 16;
        if (maskNum == 0xff000000) return 8;

        for (int i = 0; i < 32; i++) {
            if (((maskNum << i) & 0x80000000) == 0x80000000)
                prefixLength++;
            else
                break;
        }
        return prefixLength;
    }


    private static String[] parseDetailToArray(String address) {
        String[] result = address.split("\\.");
        if (result.length < 4) {
            result = new String[]{"", "", "", ""};
        }
        return result;
    }

设置静态IP的操作和无线网络一样,只是这里通过EthernetManager来设置。至此,以太网络的相关操作介绍完毕。


结尾

完结!

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值