Android環境下通過C架構層控制WIFI【轉】

來源:互聯網
上載者:User

標籤:ctrl   enc   檔案   abi   pid   required   應用程式層   down   .net   

本文轉載自:52192631

本人是從事Linux嵌入式開發的,安卓wifi控制在安卓JAVA層已經做得非常成熟了,但我需要寫一個控制wifi的程式,需要寫一堆JAVA,我本是就不懂JAVA,所以決定跳過JAVA架構和應用程式層,直接從C架構層入手。

 

1.Android WIFI架構

 

WIFI的基本架構 :

1、wifi使用者空間的程式和庫:

      external/wpa_supplicant/

      產生庫libwpaclient.so和守護進程wpa_supplicant

2、hardware/libhardware_legary/wifi/是wifi管理庫

3、JNI部分:

      frameworks/base/core/jni/android_net_wifi_Wifi.cpp

4、JAVA部分:

      frameworks/base/services/java/com/android/server/

      frameworks/base/wifi/java/android/net/wifi/

5、WIFI Settings應用程式位於:

      packages/apps/Settings/src/com/android/settings/wifi/

6、WIFI 驅動模組  wlan.ko

      wpa_supplicant通過wireless_ext 介面和驅動通訊

7、WIFI 硬體模組

2.Hardware層2.1.載入卸載驅動

 

載入:insmod /system/lib/modules/bcmdhd.ko  iface_name=wlan0

卸載:rmmod bcmdhd

 

2.2.啟動wpa_supplicant

執行setprop ctl.start wpa_supplicant

說明:執行上面命令時,安卓系統會調用到/init.macallan.rc下語句:

service wpa_supplicant /system/bin/wpa_supplicant \

    -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \

    -I/system/etc/wifi/wpa_supplicant_overlay.conf \

    -O/data/misc/wifi/sockets \

    -e/data/misc/wifi/entropy.bin [email protected]:wpa_wlan0

    # we will start as root and wpa_supplicant will switch to user wifi

    # after setting up the capabilities required for WEXT

    # user wifi

    # group wifi inet keystore

    class main

    socket wpa_wlan0 dgram 660 wifi wifi

    disabled

    oneshot

 

為防止wpa_supplicant已經啟動導致wifi無法正常工作,這裡之後先關閉一下wpa_supplicant再啟動。

 

2.3.關閉wpa_supplicant

執行setprop ctl.stop wpa_supplicant

詳細查看Wifi.c (\android\hardware\libhardware_legacy\wifi)

 

2.4.搜尋AP

執行wpa_cli  -iwlan0  IFNAME=wlan0  scan 開始搜尋

執行wpa_cli  -iwlan0  IFNAME=wlan0  scan_result 顯示搜尋結果

說明:這句命令和標準的(Linux系統)wpa_supplicant有區別,標準的是執行:

wpa_cli  -iwlan0  scan 因為安卓系統的wpa_supplicant工具是剪裁過的。

搜尋結果如下:

bssid                / frequency  / signal level       / flags                                         / ssid

MAC地址        頻率  訊號      加密模式                        AP名稱  

30:fc:68:19:57:70  2462  -41   [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]    aaaa

30:fc:68:72:36:d2  2462  - 44  [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]  TP-LINK_dd

b8:20:e7:00:32:9e  2437  -46  [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]   ccc

b8:20:e7:00:0c:ce  2422  -46   [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]   dd

e0:05:c5:ac:6d:fc   2472  -49   [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]   Tee

14:cf:92:6e:1d:5e  2437   -50  [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]    Xdaf

bc:46:99:73:1d:42  2412  -80   [WPA-PSK-CCMP][WPA2-PSK-CCMP][ESS]    Testdfege

00:0c:43:30:52:a8       2437    -43     [WEP][ESS]      G5000_JOYKOLN

b8:20:e7:00:0a:62       2437    -65     [WEP][ESS]      G5000_JOYKOLN

28:f0:76:18:c1:16       2462    -48     [ESS]   iMacQIU\xe7\x9a\x84iMac

 

2.5.wpa_supplicant.conf設定檔

位於/data/misc/wifi/wpa_supplicant.conf   

    

沒有啟動wifi時(wpa_supplicant沒有開啟)檔案顯示:

ctrl_interface=/data/misc/wifi/sockets

disable_scan_offload=1

update_config=1

device_name=macallan

manufacturer=NVIDIA

model_name=Macallan

model_number=Macallan

serial_number=JKD01V20030000022

device_type=10-0050F204-5

config_methods=physical_display virtual_push_button

p2p_disabled=1

 

開啟wifi時檔案顯示:

ctrl_interface=/data/misc/wifi/sockets

disable_scan_offload=1

update_config=1

device_name=macallan

manufacturer=NVIDIA

model_name=Macallan

model_number=Macallan

serial_number=JKD01V20030000022

device_type=10-0050F204-5

config_methods=physical_display virtual_push_button

p2p_disabled=1

 

network={

        ssid="JET-1"

        psk="abcd1234"

        key_mgmt=WPA-PSK

        priority=1

}

 

2.6.重啟wpa_supplicant

執行wpa_cli  -iwlan0  IFNAME=wlan0  reconfigure

說明:當初始化啟動wpa_supplicant時,因還沒有串連AP資訊,必須通過scan_result命令擷取到當前搜尋的AP,並自定AP寫入設定檔中,再執行reconfigure命令重啟wpa_supplicant。

 

2.7.啟動DHCP和啟動關閉網路

在啟動wpa_supplicant之前需要啟動一下網路

執行netcfg wlan0 up

啟動DHCP,當已經串連到AP時,這裡需要設定一下IP,一般情況下是使用動態IP的

執行netcfg wlan0 dhcp

關閉wpa_supplicant後這裡需要同時關閉網卡網路

執行netcfg wlan0 down

 

這樣一個流程就完成了。當然這裡還需要編寫一個小程式,以搜尋所有的AP資訊,並把需要串連的AP資訊,並寫入設定檔。

 

這種方法是繞過安卓JAVA架構層和JAVA應用程式層,直接和C架構層通訊的控制WIFI功能例子,這樣可以完全讓使用者可以自己控制wifi功能,與有線網卡運用自動切換功能。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。 52192631

Android環境下通過C架構層控制WIFI【轉】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.