Android系統中通過shell命令實現wifi的連接控制

簡介

工作中遇到一個“變態”的需求,在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。

感想

有時解決問題,需要一點點靈感,一下子的靈光乍現也能解決一些問題,但總感覺很虛,我更喜歡循序漸進的構建知識體系,感覺這樣更踏實些。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450212.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450212.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450212.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

程序員賺大錢

本文共分三部分,現在打開的是《第一部分》,歡迎繼續閱讀《第二部分》和《第三部分》1 引子 都說海闊憑魚躍,又有多少魚能躍出大海?都說天高任鳥飛,但真正能一飛沖天的,也不過是寥寥數鷹而已;在…

MySQL索引底層實現原理

索引的本質 MySQL官方對索引的定義為:索引(Index)是幫助MySQL高效獲取數據的數據結構。提取句子主干,就可以得到索引的本質:索引是數據結構。 我們知道,數據庫查詢是數據庫的最主要功能之一。我們都希望查詢…

解決 A component required a bean of ‘XXX.RoleService‘ that could not be found.

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 springboot工程啟動報錯,無法啟動成功。 dubbo訂閱服務失敗,提示如下: 出錯原因:唉&…

開源個小工具simple-repo

背景 了解android系統的都應該熟悉repo這個工具,google為了方便管理數百個git倉庫,開發了repo這個批量管理工具。不過google repo project配置比較麻煩,而通過gitbucket搭建git server則比較傻瓜,所以此處開發了simple-repo這么一…

配合OAuth2進行單設備登錄攔截

2019獨角獸企業重金招聘Python工程師標準>>> 要進行單設備登錄,在其他地點登錄后,本地的其他操作會被攔截返回登錄界面。 原理就在于要在登錄時在redis中存儲Session,進行操作時要進行Session的比對。 具體實現,假設我們的OAuth 2…

朱大鳴:中國金融危機到底有多嚴重

我們到底該不該救助金融機構,中國鈔票到底有沒有超發,對于這個問題,央行行長周小川日前撰文全面為之辯護:對于第一個問題,他的觀點是金融業出現了問題就必須救,否則意味著集體的失靈甚至死亡;中…

C++知識點(六)數組、指針與字符串導學

1.數組 地址連續存放初始化:列出全部初始值后,第1維下標個數可以省略不做初始化,局部變量中為垃圾數據,static變量為0只對一部分進行初始化,其余數值初始化為02.動態內存分配: new delete 3.動態創建數組 n…

Android應用開發—知識點匯總

獲取Fragment的context: getActivity().getApplicationContext()或者getActivity()You can use getActivity(), which returns the activity associated with a fragment.The activity is a context (since Activity extends Context).設置TextView的顏色setTextCol…

條件渲染vue

v-if:只渲染一次的情況下,性能更好v-show:頻繁切換性能更好 vue虛擬DOM技術 瀏覽器:渲染引擎(慢)JS引擎(快) 用1個JS對象來充當DOM對象,因為JS對象性能比較快,所以用虛擬DOM對象進行…

錢線觀察:貨幣基金T+0駕到 活期存款將死?

導語:即使沒有任何投資風險,通脹也在侵蝕居民的財富,現金是不安全的。最近出現的一項業務,貨幣基金"T0"贖回,意味著貨幣基金可以像活期存款一樣即時取現,而其收益率普遍高于活期存款。因此有人認…

git stash和git stash pop

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 git stash 可用來暫存當前正在進行的工作, 比如想pull 最新代碼, 又不想加新commit, 或者另外一種情…

CentOS 7.0 上安裝和配置 VNC 服務器

作為一個系統管理員,大多數時間是通過網絡管理服務器的。在管理服務器的過程中很少會用到圖形界面,多數情況下我們只是用 SSH 來完成我們的管理任務。在這篇文章里,我們將配置 VNC 來提供一個連接我們 CentOS 7 服務器的方法。VNC 允許我們開…

Android應用開發—TextView的動態創建

動態創建TextView的兩種方式&#xff1a; 下面介紹兩種創建方式&#xff1a; 在drawable里面創建共同依賴的background.xml文件&#xff0c;里面設置shape來設置文本框的一些特殊效果&#xff1a; eg&#xff1a; <?xml version"1.0" encoding"utf-8"…

Mongo DB 簡單搭建和部署

1.先下載源代碼包 官網下載地址&#xff1a;http://www.mongodb.org/downloads 2.解包tar xf mongodb-linux-x86_64-rhel62-3.2.7.tgz 3.把包移動到 /usr/local/mongodb mv mongodb-linux-x86_64-rhel62-3.2.7/ /usr/local/mongodb 指定同一時間最多可開啟的文件數&#xff08…

運算符優先級 必熟記,放到心里

優先級 運算符 名稱或含義 使用形式 結合方向 說明 1 [] 數組下標 數組名[常量表達式] 左到右 () 圓括號 &#xff08;表達式&#xff09;/函數名(形參表) . 成員選擇&#xff08;對象&#xff09; 對象.成員名 -> 成員選擇&#xff08;指針&#xff0…

可持久化平衡樹(FHQ Treap)

兩個最基本的操作 merge合并 split分割 merge 把兩棵treap合并成一棵treap&#xff0c;要滿足T1最大值要比T2最小值小&#xff0c;比較將隨機數值key值更大的作為合并后的根 假設T1作為根節點作為新子樹的根&#xff0c;左子樹不變&#xff0c;右子樹對T1原來的右子樹與T2再遞歸…

Git 分支管理-git stash 和git stash pop

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 合并分支&#xff0c;沖突是難免的&#xff0c;在實際協作開發中我們遇到的情況錯綜復雜&#xff0c;今天就講兩個比較重要的命令使用gi…

useState語法講解

useState語法講解 語法定義 const [state, dispatch] useState(initData)state&#xff1a;定義的數據源&#xff0c;可視作一個函數組件內部的變量&#xff0c;但只在首次渲染被創造。dispatch&#xff1a;改變state的函數&#xff0c;推動函數渲染的渲染函數。dispatch有兩…

NSOperation的進階使用和簡單探討

本文將會從多個方面探討NSOperation類和NSOperationQueue類的相關內容 一、簡介 NSOperation類是iOS2.0推出的&#xff0c;通過NSThread實現的,但是效率一般。 從OS X10.6和iOS4推出GCD時&#xff0c;又重寫了NSOperation和NSOperationQueue&#xff0c;NSOperation和NSOperati…