2016-03-05 55 views
1

我想限制WiFi網絡,用戶可以通過Android(CyanogenMod的)選擇。我的一個方法是過濾服務級別的網絡。但是,我無法找到WifiManager如何綁定到wpa_supplicant。所以我的問題是:Android WifiManager如何連接到wpa_supplicant?

  1. Java Wifi-Stack如何與wpa_supplicant連接?
  2. 如何限制WiFi網絡的Android平板電腦用戶的任何其他的想法?

對問題1的回答通常會幫助我理解Android服務如何綁定到Linux服務。

UPDATE:

挖掘更多的進入了Android的代碼,我發現真正的問題是:

  • 在哪裏可以找到IWifiManager的實施?
  • 凡WifiManager實例化由系統?
+0

你是否努力使基於CyanogenMod的你自己的ROM? –

+0

是的,這是正確的大衛。 – Martin

回答

2

Java Wifi-Stack如何與wpa_supplicant連接?

在「好老的Android時間」,在Java依賴於一些JNI的對局插座(文件描述符)的與之文本形式進行溝通與wpa_supplicant溝通。通過select()在des文件上書寫/閱讀。一旦你有一個wpa_supplicant運行(或hostapd),只要你配置了這些正確的,你有一個本地套接字,你可以選擇/讀/寫命令,並從中獲取結果

在這裏看到關於它的一些解釋:

https://w1.fi/wpa_supplicant/devel/ctrl_iface_page.html

你可以用這個自己使用的wpa_clihostapd_cli程序在PC上,這些任務的實驗:將命令發送到後臺,得到異步響應等環/ rince /重複的WPA SUP」使用其-C = ctrl_interface parameter和了用於hostapd使用-g global control interface路徑選項中,還是在相應的配置文件。你基本上得到的是一種與守護進程進行通信的shell,所以這一切都歸結爲創建命令字符串和解析字符串響應。你可能會發現這是在wifi-legacy或類似的東西從你的Android源代碼樹。

這是隻是工作非常務實,簡單的方法。

現在,實際真正的,長期的解決方案,正確的方式與內核通信的Wi-Fi mac80211/nl80211層是通過libnl。從我所看到的情況來看,谷歌現在使用的方式就是這樣。 但是! B UT:它帶有一個陡峭的學習曲線,因爲要使用的庫是非常可擴展/通用的,這意味着「做最基本的事情很複雜」,並且libnl帶有很多API更改。如果你是谷歌,有沒有問題,這是一個非常有價值的投資,我們將圍繞這個沒有得到永遠無論如何,所以去了,我們到處都會使用它。使用libnl與802.11內核層進行通信,並圍繞它建立一些更高級別的代碼。

如果你是一個普通用戶,歡迎幾天(周?)進入libnl 802.11使用。

+0

感謝您的解釋,jbm。然而,我更多地尋找對「WifiManager」抽象的解釋與wpa_supplicant封裝的具體實現有關。網絡鏈路(libnl)不用於的wpa_supplicant和WifiManager,我猜,而是與內核堆棧無線上網通信之間的通信。 – Martin