Android 以太网DHCP、STATIC两种IP分配方式的API调用

Android4.0已经加入了以太网的支持,但4.0和5.0及以后安卓版本的相关代码差距还是蛮大的,5.0之后的主要API代码就没什么差别了。

1、这里介绍5.1的API调用方法实现以太网两种方式上网:

(最后使用到了EthernetManager类的API,EthernetManager类是@hide的,通过SDK访问不到。我这里是在系统应用中添加的需求,系统级App是可以访问到的。第三方app可以使用反射的方式调用:反射调用EthernetManager参考博客地址 )


mConTypeGroup:是一个RadioGroup组件,我的布局中RadioGroup包含了代表DHCP、STATIC的两个RadioButton。

根据选中的RadioButton切换IP分配方式。

一个IP分配方式配置中,至少要包含 IP地址子网掩码网关DNS(一个或多个)四个属性。


EthernetManager mEthManager = (EthernetManager) getSystemService(Context.ETHERNET_SERVICE);
if(mConTypeGroup.getCheckedRadioButtonId() == R.id.manual_radio){//静态ip
			try {
			    //每个IpConfiguration对象内部都包含了一个StaticIpConfiguration对象,对于DHCP方式来说这个对象赋为null
				StaticIpConfiguration staticIpConfiguration = new StaticIpConfiguration();//用于保存静态IP、dns、gateway、netMask相关参数配置
				InetAddress mIpAddr = NetworkUtils.numericToInetAddress(mIpaddr.getText().toString());//把192.168.1.1这种格式字符串转化为IP地址对象
				String[] strs = mMask.getText().toString().split("\\.");
				int count = 0;
				for(String str : strs){
					if(str.equals("255")){
						count++;
					}
				}
				int prefixLength = count*8;
				LinkAddress mIpAddress = new LinkAddress(mIpAddr,prefixLength);//prefixLength就是表示子网掩码字符有几个255,比如255.255.255.0的prefixLength为3
				InetAddress mGateway = NetworkUtils.numericToInetAddress(mGw.getText().toString());//默认网关
				ArrayList mDnsServers = new ArrayList();//DNS
				mDnsServers.add(NetworkUtils.numericToInetAddress(mDns1.getText().toString()));
				mDnsServers.add(NetworkUtils.numericToInetAddress(mDns2.getText().toString()));
				
				staticIpConfiguration.ipAddress = mIpAddress;
				staticIpConfiguration.gateway = mGateway;
				staticIpConfiguration.dnsServers.addAll(mDnsServers);
				
				//ProxySettings为代理服务配置,主要有STATIC(手动代理)、PAC(自动代理)两种,NONE为不设置代理,UNASSIGNED为未配置代理(framework会使用NONE替代它)
				//ProxyInfo包含代理配置信息
				config = new IpConfiguration(IpAssignment.STATIC, ProxySettings.NONE, staticIpConfiguration, ProxyInfo.buildDirectProxy(null,0));
				mEthManager.setConfiguration(config);//执行该方法后,系统会先通过EthernetConfigStore保存IP配置到data/misc/ethernet/ipconfig.txt,再更新以太网配置、通过EthernetNetworkFactory重启eth设备(最终通过NetworkManagementService来操作开启关闭设备、更新状态)
				//NetworkManagementService服务中提供了各种直接操作eth设备的API,如开关、列举、读写配置eth设备,都是通过发送指令实现与netd通信
				//Netd 就是Network Daemon 的缩写,表示Network守护进程,Netd负责跟一些涉及网络的配置,操作,管理,查询等相关的功能实现
			}catch (Exception e) {
	            e.printStackTrace();  
	        }
		}else {//动态ip
			try {
			    //对比STATIC,只需要把StaticIpConfiguration赋值为null
				config = new IpConfiguration(IpAssignment.DHCP, ProxySettings.NONE, null, ProxyInfo.buildDirectProxy(null,0));
				mEthManager.setConfiguration(config);
			}catch (Exception e) {
	            e.printStackTrace();  
	        }
		} 

2、 如果系统源码有以太网相关驱动、程序,但未配置过以太网,还需要配置以下,让以太网驱动被加载编译进系统:

kernel-3.18/arch/arm/configs/t52_5m_8735b_3h_defconfig文件中添加类似下列配置:


#for eth
CONFIG_MII=y
CONFIG_USB_NET_DRIVERS=y
CONFIG_USB_USBNET=y
CONFIG_USB_RTL8150=y
CONFIG_USB_RTL8152=y
CONFIG_USB_NET_AX8817X=y
CONFIG_USB_NET_AX88179_178A=y


3、然后要想使用以太网的DHCP,需要在init.<源码项目名>.rc中模仿wifi的dhcp来添加一个或多个service(对于多以太网卡来说):


service dhcpcd_wlan0 /system/bin/dhcpcd -BK -dd  #这是wifi的dhcp服务,/system/bin/dhcpcd是一个可执行文件,用于动态获取IP
    class main
    user root
    group net_admin net_raw
    disabled
    oneshot
...
...
service dhcpcd_eth0 /system/bin/dhcpcd -ABDKL #规则:"dhcpcd"加上"_<网卡设备接口名>"
    class main 
    disabled
    oneshot
    
service dhcpcd_eth1 /system/bin/dhcpcd -ABDKL #规则:"dhcpcd"加上"_<网卡设备接口名>"
    class main 
    disabled
    oneshot
    


一个机器可能有多个以太网设备,需符合eth0,eth1,eth2...的命名(源码中会检查名称的)。


你可能感兴趣的:(Android)