Android系統中通過shell命令實現wifi的連線控制
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/voidreturn/article/details/75213206
簡介
工作中遇到一個“變態”的需求,在android系統中不通過java層控制wifi的連線(主要是修改ap的essid和password),而是需要通過native層實現對wifi的控制。
How
- 接到這個需求時,第一個想法是如何找到Android native層對應的wifi控制介面(也就是一些c層的介面),由於c層的介面都是android framework層的介面,屬於內部介面,android系統在設計之初就沒想暴露太多這層的介面,所以並沒有相關的文件說明(其實我也沒花太多時間去搜尋,所以暫且認為沒有官方文件吧,不過我估計對android wifi模組有深入研究的人,應該會比較熟悉這方面的介面)
- 分析wpa_supplicant service引數,wifi的控制逃不開wpa相關的服務,通過ps檢視了wpa_supplicant的啟動引數發現androd系統是通過解析/data/misc/wifi/wpa_supplicant.conf 這個conf檔案來控制連線哪個ap,所以我麼只需要修改這個conf檔案,然後重啟wpa_supplicant這個服務即可。
- 基於前面的分析,貌似該問題很容易解決,但是對wpa_supplicant服務的啟停,遇到問題,kill掉後,重啟wpa_supplicant無效,在沒有查明問題原因的時候,發現了svc wifi enable/disable命令,這個命令實現了wpa_supplicant的啟停而不用關心引數的設定。
- 有了svc wifi這個命令,一切都簡單多了,但是除錯過程中,仍然遇到了問題,比如我輸入錯誤的password,android會嘗試多次重現連線ap,最後顯示無法連線,然後我們修改wpa_supplicant.conf輸入正確的password後,通過svc wifi啟停wpa_supplicant服務,android系統不會嘗試重新連線,仍然顯示之前的錯誤狀態,甚至重啟系統,仍然不會重新連線。
- 在反覆嘗試確定前面的現象後,又陷入了一個僵局,一直找不到通過shell觸發重新連線的方式。在試過各種情況後,已經想不到其他嘗試的方式後,安靜下來,思考了下,突然意識到這個狀態一定是快取了,而且不是快取在程式碼層面(記憶體),而是快取在檔案上,否則重啟應該不會再記錄之前的狀態。所以無目的的檢視了/data/misc/wifi目錄下的檔案,發現networkHistory.txt這麼個檔案,直覺上感覺就是它了,刪除之,通過svc wifi重啟wpa_supplicant服務,立馬觸發連線。
總結
通過上面的分析,通過shell命令實現wifi的連線控制只需要:
- 通過svc wifi disable關閉wifi
- 修改/data/misc/wifi/wpa_supplicant.conf配置檔案
- 刪除/data/misc/wifi/networkHistory.txt檔案
- 通過svc wifi enable開啟wifi
由於對該“變態”的需求沒有太多的興趣,所以導致連看看networkHistory.txt的內容都沒有,更沒有去深入研究這個檔案對連線的影響,想想自己探究問題本質的慾望怎麼越來越小了呢。由於筆者換了技術方向,近期也沒時間深入研究這個了,寫這個篇文章時大概搜尋了下,發現了一篇文章貌似講到了這個連線過程的,有興趣的朋友可以繼續看看http://www.itnose.net/detail/6637117.html。
感想
有時解決問題,需要一點點靈感,一下子的靈光乍現也能解決一些問題,但總感覺很虛,我更喜歡循序漸進的構建知識體系,感覺這樣更踏實些。
相關文章
- Linux下如何通過命令連線wifiLinuxWiFi
- windows 通過cmd命令(netsh wlan命令)連線wifiWindowsWiFi
- 使用命令檢視windows系統連線過的wifi密碼WindowsWiFi密碼
- 求助:關於通過電腦控制安卓手機 連線指定 WIFI安卓WiFi
- 樹莓派透過nmcli命令連線WIFI樹莓派WiFi
- w10系統怎麼連線wifi_win10系統如何連線wifiWiFiWin10
- 《怎樣實現通過shell指令碼將使用者踢出系統》指令碼
- Shell 中的連線符:&&、||
- Linux 命令列下連線WiFiLinux命令列WiFi
- Android通過Chronometer控制元件實現計時功能Android控制元件
- 通過swap_join_inputs來控制多表連線hash join中的build tableUI
- Linux 系統如何通過 netstat 命令檢視連線數判斷攻擊Linux
- 通過cmd命令列連線mysql資料庫命令列MySql資料庫
- Windows 8.1系統連線受限或無法連線WiFi怎麼辦?WindowsWiFi
- Linux 下命令列連線Wifi方法Linux命令列WiFi
- 通過shell繫結系統程式調優
- win10wifi連線受限如何解決_win10系統wifi連線受限怎麼辦Win10WiFi
- Win8.1系統無線wifi連線記錄如何清除WiFi
- windows10系統如何連線隱藏的wifi無線訊號WindowsWiFi
- adb透過wifi連線手機WiFi
- 【android】自定義佈局控制控制元件的位置可以通過繼承FrameLayout實現Android控制元件繼承
- VirtualBox CentOS 7實現本地系統連線CentOS
- mysql 通過IP連線MySql
- root使用者無法通過ssh連線Linux系統Linux
- windows系統下實現Redis的配置與連線操作WindowsRedis
- Android中使用WIFI來連線ADBAndroidWiFi
- Android通過Wifi來除錯你的應用AndroidWiFi除錯
- Qt中通過ODBC連線MSSQL資料庫QTSQL資料庫
- win10系統如何通過命令關閉系統賬戶_win10通過命令關閉系統賬戶的步驟Win10
- 解決Pixel、Lineage等原始系統中的WIFI網路連線受限問題WiFi
- SAP ECC系統連線SAP PI系統的系統連線配置
- linux系統使用shell命令過濾物理網路卡Linux
- Android中通過程式注入技術修改系統返回的Mac地址AndroidMac
- Mac出現WiFi連線問題怎麼辦 Mac WiFi連線問題解決方法MacWiFi
- Laravel 通過 ODBC 連線 VerticaLaravel
- 通過跳板機連線MySQLMySql
- win10系統連線wifi速度慢如何解決Win10WiFi
- Android中通過Messenger與Service實現程式間雙向通訊AndroidMessenger