2010年7月14日 星期三

Wifi模塊的啟動(轉貼)



三:Wifi模塊的啟動

WirelessSettings 在初始化的時候配置了由WifiEnabler 來處理Wifi 按鈕,

private void initToggles() {
mWifiEnabler = new WifiEnabler(this,
(WifiManager) getSystemService(WIFI_SERVICE),
(CheckBoxPreference) findPreference(KEY_TOGGLE_WIFI));

當用戶按下Wifi 按鈕後,Android 會調用WifiEnabler 的onPreferenceChange,再由WifiEnabler
調用WifiManager 的setWifiEnabled 接口函數,通過AIDL,實際調用的是WifiService 的
setWifiEnabled 函數,WifiService 接著向自身發送一條MESSAGE_ENABLE_WIFI 消息,在
處理該消息的代碼中做真正的使能工作:首先裝載WIFI 內核模塊(該模塊的位置硬編碼為
"/system/lib/modules/wlan.ko" ), 然後啟動wpa_supplicant ( 配置文件硬編碼為
"/data/misc/wifi/wpa_supplicant.conf"),再通過WifiStateTracker 來啟動WifiMonitor 中的監視
線程。

private boolean setWifiEnabledBlocking(boolean enable) {
final int eventualWifiState = enable ? WIFI_STATE_ENABLED :WIFI_STATE_DISABLED;
updateWifiState(enable ? WIFI_STATE_ENABLING : WIFI_STATE_DISABLING);
if (enable) {
if (!WifiNative.loadDriver()) {
Log.e(TAG, "Failed to load Wi-Fi driver.");
updateWifiState(WIFI_STATE_UNKNOWN);
return false;
}
if (!WifiNative.startSupplicant()) {
WifiNative.unloadDriver();
Log.e(TAG, "Failed to start supplicant daemon.");
updateWifiState(WIFI_STATE_UNKNOWN);
return false;
}
mWifiStateTracker.startEventLoop();
}
// Success!
persistWifiEnabled(enable);
updateWifiState(eventualWifiState);
return true;
}


當使能成功後,會廣播發送WIFI_STATE_CHANGED_ACTION 這個Intent 通知外界WIFI
已經成功使能了。WifiEnabler 創建的時候就會向Android 註冊接收
WIFI_STATE_CHANGED_ACTION,因此它會收到該Intent,從而開始掃瞄。

private void handleWifiStateChanged(int wifiState) {
if (wifiState == WIFI_STATE_ENABLED) {
loadConfiguredAccessPoints();
attemptScan();
}

具體流程如下流程圖所示:







Wifi模塊的初始化(轉貼)

二:Wifi模塊的初始化:


在 SystemServer 啟動的時候,會生成一個ConnectivityService 的實例,



try {
Log.i(TAG, "Starting Connectivity Service.");
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, new
ConnectivityService(context));
} catch (Throwable e) {
Log.e(TAG, "Failure starting Connectivity Service", e);
}



ConnectivityService 的構造函數會創建WifiService,


if (DBG) Log.v(TAG, "Starting Wifi Service.");
mWifiStateTracker = new WifiStateTracker(context, handler);
WifiService wifiService = new WifiService(context, mWifiStateTracker);
ServiceManager.addService(Context.WIFI_SERVICE, wifiService);



WifiStateTracker 會創建WifiMonitor 接收來自底層的事件,WifiService 和WifiMonitor 是整
個模塊的核心。WifiService 負責啟動關閉wpa_supplicant、啟動關閉WifiMonitor 監視線程
和把命令下發給wpa_supplicant,而WifiMonitor 則負責從wpa_supplicant 接收事件通知。


具體流程圖如下:

Wifi介紹(轉貼)

概述

WIFI 就是一種無線聯網的技術,以前通過網線連接電腦,而現在則是通過無線電波來連網;常見的就是一個無線路由器,那麼在這個無線路由器的電波覆蓋的有效範圍都 可以採用WIFI連接方式進行聯網,如果無線路由器連接了一條ADSL線路或者別的上網線路,則又被稱為「熱點」。

運作原理

Wi-Fi 的設置至少需要一個Access Point(ap)和一個或一個以上的client(hi)。AP每100ms將SSID(Service Set Identifier)經由beacons(信號台)封包廣播一次,beacons封包的傳輸速率是1 Mbit/s,並且長度相當的短,所以這個廣播動作對網絡效能的影響不大。因為Wi-Fi規定的最低傳輸速率是1 Mbit/s ,所以確保所有的Wi-Fi client端都能收到這個SSID廣播封包,client 可以借此決定是否要和這一個SSID的AP連線。使用者可以設定要連線到哪一個SSID。Wi-Fi系統總是對用戶端開放其連接標準,並支援漫遊,這就是 Wi-Fi的好處。但亦意味著,一個無線適配器有可能在性能上優於其他的適配器。由於Wi-Fi通過空氣傳送信號,所以和非交換以太網有相同的特點。 近兩年,出現一種WIFI over cable的新方案。此方案屬於EOC(ethernet over cable)中的一種技術。通過將2.4G wifi射頻降頻後在cable中傳輸。此種方案已經在中國大陸小範圍內試商用。

2010年7月11日 星期日

OpenGL Study

上週六跟教授meeting後,教授說要交一份OpenGL的Homework
所以只好去Survey一下了
為了怕之後忘記看過哪些好文
按照慣例把看過得好文貼在Blog上免得以後忘記囉

Jaus Books

Howto Install OpenGL Development Environment(Ubutu)

2010年5月9日 星期日

因為查爾斯的推薦,我才接觸了git這個版本控制工具
操作起來覺得挺不錯而且有UI tool,簡直就像Linix的小烏龜

下面貼一些操作介紹網址

Git原始碼管理

Git 中文教程

Git 初學筆記 - 指令操作教學

Install sun-java5-jdk to Ubuntu9.10

ReMark from http://www.zooyoo.org/?p=10442
修改source,將9.10的源改成9.04的源。
deb http://run.hit.edu.cn/ubuntu/ jaunty main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty main restricted universe multiverse
deb http://run.hit.edu.cn/ubuntu/ jaunty-updates main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-updates main restricted universe multiverse
deb http://run.hit.edu.cn/ubuntu/ jaunty-backports main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-backports main restricted universe multiverse
deb http://run.hit.edu.cn/ubuntu/ jaunty-security main restricted universe multiverse
deb-src http://run.hit.edu.cn/ubuntu/ jaunty-security main restricted universe multiverse
update之後,用sudo apt-get install sun-java5-jdk 即可像以往一樣安裝java 1.5
安裝後的基本設置:
sudo update-alternatives --config java
sudo update-java-alternatives -s java-1.5.0-sun
這時候再用java -version就能看到java 1.5已經正常工作了
最後把源換回9.10的

2010年4月28日 星期三

在 vim 顯示Gtk+ 特有語法




可參考 David Necas 所提交的 [gtk-vim-syntax], 其簡介為 "A collection of C extension syntax files for xlib, glib, gobject, gdk, gdk-pixbuf, gtk+, atk, pango, cairo, gimp, libgnome, libgnomecanvas, libgnomeui, libglade, gtkglext, vte, linc, gconf, and ORBit.",實在誘人。安裝方式也很單純,解開後參閱裡頭的 README 檔案,將套件中的 *.vim 檔案複製到 "~/.vim/after/syntax/" 目錄下,並將參考性的 "c.vim.example" 複製到 "~/.vim/after/syntax/c.vim"。另外,實際運用時,我們或許會期望 gtk-vim-syntax 切換 deprecated symbols 的顯示,那麼,可在 vim 設定如下:
:let glib_enable_deprecated = 1