|
編程時(shí)候發(fā)現(xiàn)當(dāng)打開WIFI網(wǎng)絡(luò)的時(shí)候系統(tǒng)默認(rèn)就會(huì)把3G網(wǎng)絡(luò)給關(guān)閉,估計(jì)是出于省電的原因才如此做的,但目前我需要同時(shí)使用這兩個(gè)網(wǎng)絡(luò)接口,經(jīng)過一番研究找到了方法,故寫成日志記錄下來。 1、android網(wǎng)絡(luò)機(jī)制。 wifi的開啟關(guān)閉首先由應(yīng)用程序觸發(fā)的事件開始(比如用戶點(diǎn)擊開啟圖標(biāo)),然后傳入framework層,framework層啟動(dòng)wpa_supplicant,同時(shí)建立socket連接與wpa_supplicant進(jìn)行通信,包括對wpa_supplicant的控制與得到wpa_supplicant的回傳結(jié)果。若連接上了一個(gè)無線網(wǎng)絡(luò),則調(diào)用dhcp服務(wù)申請ip地址(或者使用預(yù)先設(shè)置好的ip,不過大部分情況下是dhcp的)。若這一切正常則斷開3g網(wǎng)絡(luò)連接并關(guān)閉3g接口。 因此從這個(gè)角度分析,若要同時(shí)啟動(dòng)3g和wifi則必須繞過framework層,手動(dòng)完成上述所有操作。 因此我找到的方法是在3g網(wǎng)絡(luò)不斷的情況下,手動(dòng)啟動(dòng)wifi網(wǎng)絡(luò),連接指定ap并申請ip。 2、操作步驟。 (1) 準(zhǔn)備工作 因?yàn)闋砍兜降讓硬僮?,所以root必不可少,在root的情況下進(jìn)入adb shell,若adb daemon沒有root使用adb root命令進(jìn)而使adb shell獲得root權(quán)限。 原則上使用android里的終端軟件也是可以的,但我沒有測試。 (2)加載wifi驅(qū)動(dòng)。 不加載驅(qū)動(dòng)在netcfg里面根本看不到wlan0網(wǎng)卡,因此首先要加載驅(qū)動(dòng)。 一般情況下,驅(qū)動(dòng)放在/system/lib/modules下,我的驅(qū)動(dòng)模塊是wlan.ko。 insmod /system/lib/modules/wlan.ko。 加載前:
加載后:
發(fā)現(xiàn)多出來了wlan0也就是wifi網(wǎng)卡
(3)開啟wifi網(wǎng)卡 使用netcfg wlan0 up開啟wifi網(wǎng)卡,使用ifconfig wlan0 up也同樣可以。 開啟后:
(4)連接ap 啟動(dòng)wpa_supplicant并使之連接ap,在使用android系統(tǒng)時(shí),如果開啟wifi后范圍內(nèi)有一個(gè)之前連接過的wifi(而且這個(gè)wifi的ssid和密碼還沒改的話),那么我們的系統(tǒng)就會(huì)自動(dòng)連接到這個(gè)wifi。因此手機(jī)里肯定是在某處記錄者各個(gè)曾經(jīng)連接過的wifi的ssid和密碼。 我的手機(jī)(小米2,miui開發(fā)版3.xxx)這個(gè)默認(rèn)位置是/data/misc/wifi/wpa_supplicant.conf。當(dāng)把這個(gè)配置文件傳給wpa_supplicant啟動(dòng)的時(shí)候,就會(huì)自動(dòng)嘗試連接其中記錄的wifi網(wǎng)絡(luò)。 使用命令wpa_supplicant -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf -B 啟動(dòng)wpa_supplicant,-B代表后臺運(yùn)行,-i指定無線網(wǎng)卡。 此時(shí)若一切正常就會(huì)連接上無線ap,使用dmesg查看信息得到:
可以看到有連接成功的信息。
(5)使用dhcp獲取ip信息 連接上了暫時(shí)還不能用,因?yàn)闆]有配置ip,使用dhcpcd wlan0配置ip信息,使用netcfg wlan0 dhcp也可以。 若出現(xiàn)類似以下信息則說明成功。
此時(shí)我們就在android下同時(shí)啟用了wifi和3g。 此時(shí)使用netcfg可以看到兩個(gè)接口都有ip,說明我們的方法有效。
當(dāng)然最重要的是以上操作都可以在android用簡單的程序來實(shí)現(xiàn)。 |
|
|