- 2月 16 週四 201215:16
以色列國家公園MASADA、怎樣都沉不下去的死海、很臭像爛泥巴的死海泥
- 2月 16 週四 201215:01
福音真的要傳回耶路撒冷
- 2月 16 週四 201214:02
桂輔心怡桃園彭園宴客 2011/11/13
- 2月 16 週四 201213:14
桂輔心怡大喜之日 2011/11/11
- 12月 27 週二 201115:36
wifi 流程
1. WIFI JAVA layer:
1.1. 當android系統啟動WIFI 模組時,它將調用 Wifiserver 類的setWifiEnabledBlocking函數。
1.2. 在該函數中,如果是使能WIFI, 它將做四件事:
a. load wifi driver.
b. 啟動wpa_supplicant.
c. 啟動 event loop.
d. 更新wifi的狀態.
2. WIFI Native layer:
2.1. 當java層調用 loadDriver時, 它實際上是通過JNI來調用Native函數, JNI->android_net_wifi_loadDriver ->wifi_load_driver。
在wifi_load_driver函數中,它將首先通過system property -- wlan.driver.status 的狀態來判斷驅動是否已經載入。如果沒有載入,將會載入該驅動。
2.2. 當java層調用startSupplicant時,它實際上是通過JNI調用到wifi_start_supplicant函數,
在wifi_start_supplicant函數裏,首先確定wpa supplicant的配置檔存在,如果不存在,將默認配置檔拷貝到相應目錄下,下面是配置檔的默認路徑和工作路徑:
static const char SUPP_CONFIG_TEMPLATE[]= "/system/etc/wifi/wpa_supplicant.conf";
static const char SUPP_CONFIG_FILE[] = "/data/misc/wifi/wpa_supplicant.conf";
然後,調用control_supplicant函數, 如果這時wpa_supplicant還沒有啟動, 將會啟動wpa_supplicant.
2.3. java層通過connectToSupplicant調用wifi_connect_to_supplicant函數,在該函數中,將通過wpa_ctrl_open函數分別創建兩個AF_UNIX位址族和資料報方式的socket,一個是ctrl_conn, 用於向wpa_supplicant發送命令並接收response, 另一個是monitor_conn, 它一直阻塞等待從wpa_supplicant過來的event。最後,通過monitor_conn向wpa_supplicant發送命令ATTACH,用於將自己的socket資訊註冊到wpa_supplicant, 由於socket是資料報方式的,這一步是必須的,對於存在於wpa_supplicant的伺服器端,它是所有用戶端共用的,由於它需要主動向monitor_conn用戶端發送事件,所以它必須先記錄下該用戶端的詳細資訊,wpa_supplicant就可以將EVENT發向該socket。
在完成上面這些操作後,java層會通過jni方式調用函數android_net_wifi_waitForEvent(應該是起一個線程,線上程裏調用),該函數會調用wifi_wait_for_event,在wifi_wait_for_event函數裏,會阻塞接收從wpa_supplicant模組傳來的事件,一旦wpa_supplicant模組有事件發,wifi_wait_for_event接收到後,會將包含事件的buf通過函數參數的方式回傳到java層,java收到事件後,再繼續調用wifi_wait_for_event函數進行阻塞等待接收,從而完成一個迴圈。
2.4. 以上的流程完成以後,WIFI java layer 調用的WIFI native api 就和wpa_supplicant進程就建立了聯繫,WIFI java layer就可以向wpa_supplicant發送命令和接收response, 並且wpa_supplicant也可以主動向WIFI java layer發送事件了。
1.1. 當android系統啟動WIFI 模組時,它將調用 Wifiserver 類的setWifiEnabledBlocking函數。
1.2. 在該函數中,如果是使能WIFI, 它將做四件事:
a. load wifi driver.
b. 啟動wpa_supplicant.
c. 啟動 event loop.
d. 更新wifi的狀態.
2. WIFI Native layer:
2.1. 當java層調用 loadDriver時, 它實際上是通過JNI來調用Native函數, JNI->android_net_wifi_loadDriver ->wifi_load_driver。
在wifi_load_driver函數中,它將首先通過system property -- wlan.driver.status 的狀態來判斷驅動是否已經載入。如果沒有載入,將會載入該驅動。
2.2. 當java層調用startSupplicant時,它實際上是通過JNI調用到wifi_start_supplicant函數,
在wifi_start_supplicant函數裏,首先確定wpa supplicant的配置檔存在,如果不存在,將默認配置檔拷貝到相應目錄下,下面是配置檔的默認路徑和工作路徑:
static const char SUPP_CONFIG_TEMPLATE[]= "/system/etc/wifi/wpa_supplicant.conf";
static const char SUPP_CONFIG_FILE[] = "/data/misc/wifi/wpa_supplicant.conf";
然後,調用control_supplicant函數, 如果這時wpa_supplicant還沒有啟動, 將會啟動wpa_supplicant.
2.3. java層通過connectToSupplicant調用wifi_connect_to_supplicant函數,在該函數中,將通過wpa_ctrl_open函數分別創建兩個AF_UNIX位址族和資料報方式的socket,一個是ctrl_conn, 用於向wpa_supplicant發送命令並接收response, 另一個是monitor_conn, 它一直阻塞等待從wpa_supplicant過來的event。最後,通過monitor_conn向wpa_supplicant發送命令ATTACH,用於將自己的socket資訊註冊到wpa_supplicant, 由於socket是資料報方式的,這一步是必須的,對於存在於wpa_supplicant的伺服器端,它是所有用戶端共用的,由於它需要主動向monitor_conn用戶端發送事件,所以它必須先記錄下該用戶端的詳細資訊,wpa_supplicant就可以將EVENT發向該socket。
在完成上面這些操作後,java層會通過jni方式調用函數android_net_wifi_waitForEvent(應該是起一個線程,線上程裏調用),該函數會調用wifi_wait_for_event,在wifi_wait_for_event函數裏,會阻塞接收從wpa_supplicant模組傳來的事件,一旦wpa_supplicant模組有事件發,wifi_wait_for_event接收到後,會將包含事件的buf通過函數參數的方式回傳到java層,java收到事件後,再繼續調用wifi_wait_for_event函數進行阻塞等待接收,從而完成一個迴圈。
2.4. 以上的流程完成以後,WIFI java layer 調用的WIFI native api 就和wpa_supplicant進程就建立了聯繫,WIFI java layer就可以向wpa_supplicant發送命令和接收response, 並且wpa_supplicant也可以主動向WIFI java layer發送事件了。
- 12月 27 週二 201115:32
android WIFI 架構和控制流程
一、WIFI的基本架構
1、wifi用戶空間的程式和庫:
external/wpa_supplicant/
生成庫libwpaclient.so和守護進程wpa_supplicant。
1、wifi用戶空間的程式和庫:
external/wpa_supplicant/
生成庫libwpaclient.so和守護進程wpa_supplicant。
- 11月 08 週二 201119:54
L`atelier de Joël Robuchon 侯布雄法式餐廳 in BELLAVITA 之大快朵頤大失血大有誠意大享受
- 10月 14 週五 201123:32
三峽北大也有美式漢堡店 ~~~ BuddyBuddy

熱衷於美式漢堡的夫妻檔終於在這一日找到離家最近的非連鎖漢堡店,BuudyBuddy。一進門很簡單的就可以發現到老闆應該是個衝浪愛好者,整間店感覺彷彿置身夏威夷,就只差沒有把沙子搬進來裝潢。
- 10月 14 週五 201114:49
Android.mk 文件寫法
(1)Android.mk檔首先需要指定LOCAL_PATH變數,用於查找原始檔案。由於一般情況下
Android.mk和需要編譯的原始檔案在同一目錄下,所以定義成如下形式:
LOCAL_PATH:=$(call my-dir)
上面的語句的意思是將LOCAL_PATH變數定義成本檔所在目錄路徑。
(2)Android.mk中可以定義多個編譯模組,每個編譯模組都是以include $(CLEAR_VARS)開始以include $(BUILD_XXX)結束。
include $(CLEAR_VARS)
CLEAR_VARS由編譯系統提供,指定讓GNU MAKEFILE為你清除除LOCAL_PATH以外的所有LOCAL_XXX變數,
如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。
include $(BUILD_STATIC_LIBRARY)表示編譯成靜態庫
include $(BUILD_SHARED_LIBRARY)表示編譯成動態庫。
include $(BUILD_EXECUTABLE)表示編譯成可執行程式
(3)舉例如下(frameworks/base/libs/audioflinger/Android.mk):
java代碼:
Android.mk和需要編譯的原始檔案在同一目錄下,所以定義成如下形式:
LOCAL_PATH:=$(call my-dir)
上面的語句的意思是將LOCAL_PATH變數定義成本檔所在目錄路徑。
(2)Android.mk中可以定義多個編譯模組,每個編譯模組都是以include $(CLEAR_VARS)開始以include $(BUILD_XXX)結束。
include $(CLEAR_VARS)
CLEAR_VARS由編譯系統提供,指定讓GNU MAKEFILE為你清除除LOCAL_PATH以外的所有LOCAL_XXX變數,
如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。
include $(BUILD_STATIC_LIBRARY)表示編譯成靜態庫
include $(BUILD_SHARED_LIBRARY)表示編譯成動態庫。
include $(BUILD_EXECUTABLE)表示編譯成可執行程式
(3)舉例如下(frameworks/base/libs/audioflinger/Android.mk):
java代碼:





