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<InetAddress> mDnsServers = new ArrayList<InetAddress>();//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...的命名(源碼中會檢查名稱的)。


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