溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android上實現(xiàn)easyconfig(airkiss)方法

發(fā)布時間:2020-10-07 19:59:20 來源:腳本之家 閱讀:146 作者:zhaojieTec 欄目:移動開發(fā)

剛買回來一個智能音箱和博聯(lián),需要給音箱和博聯(lián)配置聯(lián)網(wǎng),音箱需要先打開藍牙,然后在手機app中填寫wifi的ssid和密碼,通過藍牙發(fā)送到音箱,音箱收到后連接到wifi。

博聯(lián)就比較奇怪,進入聯(lián)網(wǎng)模式以后,手機app上填寫wifi的ssid和密碼后,直接點配置按鈕后,博聯(lián)就連上了。要知道手機并沒有與這個設(shè)備建立連接,ssid和密碼不知道怎么就莫名其妙的被發(fā)送過去了。

仔細(xì)想了一下,應(yīng)該是通過wifi信號發(fā)送的,wifi本質(zhì)上是一種射頻信號,手機可以發(fā)送wifi信號,博聯(lián)上也有wifi芯片,理論上可以直接接受到手機的wifi信號而不需要經(jīng)過路由器。但究竟是怎么發(fā)送過去就不得而知。

經(jīng)過一番搜索后得知,這種技術(shù)叫做easyconfig或者smaterconfig、SmartConnect,不同的地方叫法不一樣,最早應(yīng)該是TI公司提供給博聯(lián)的。

原理就是手機發(fā)送udp廣播或者組播。博聯(lián)的無線網(wǎng)卡支持混雜模式,可以接收到環(huán)境中所有的wifi數(shù)據(jù)包,這樣手機在發(fā)送udp報文后就會被博聯(lián)捕獲到,但由于和路由器直接通訊的數(shù)據(jù)是加密的,博聯(lián)能捕獲到也并沒有什么卵用,這種的技術(shù)關(guān)鍵就在于使用長度字段來傳遞ssid和密碼信息。只需要規(guī)定編碼方式。

知道原理后,是否可以在音箱上實現(xiàn)呢?

智能音箱是安卓系統(tǒng),有root權(quán)限,并且知道使用的wifi芯片為ap6210(BCM43362)。

但并不知道音箱的wifi芯片是否可以可以接受到環(huán)境下所有的wifi數(shù)據(jù)。到博通(cypress.com)的網(wǎng)站上找了很久,發(fā)現(xiàn)有一個monitor模式,使用論壇上下載的wl工具可以開啟monitor模式,打開monitor后,使用tcpdump抓包就會收到很多數(shù)據(jù)。

所有如果要在音箱上也實現(xiàn)easyconfig就需要開啟monitor模式然后抓包,然后再根據(jù)包的長度通過某種規(guī)則傳遞ssid和wifi密碼。

開啟monitor模式可以通過執(zhí)行wl指令(或者直接發(fā)送ioctl命令)。抓包可以使用開源的tcpdump,但是通過數(shù)據(jù)包長度編碼還沒有思路。

再查看easyconfig原理時,發(fā)現(xiàn)微信有一個airkiss工具,提供一個.a的靜態(tài)庫,開啟monitor模式或混雜模式后,將收到的數(shù)據(jù)包交給airkiss,airkiss會處理解析數(shù)據(jù)的工作,airkiss也提供手機端的發(fā)送程序。

因此要實現(xiàn)easyconfig只需要實現(xiàn)如下功能就可以:

1.打開/關(guān)閉無線網(wǎng)卡monitor模式

2.使用tcpdump(libpcap)抓包

3.講抓包后收到數(shù)據(jù)后再調(diào)用airkiss的函數(shù)

4.手機端實現(xiàn)發(fā)送ssid和密碼的app,可使用微信airkiss提供的app測試

5.實現(xiàn)應(yīng)用層控制開啟/關(guān)閉,收到密碼后聯(lián)網(wǎng),聯(lián)網(wǎng)成功后通知手機端等功能

由于安卓系統(tǒng)中并沒有monitor模式或混雜模式相關(guān)的函數(shù),也無法實現(xiàn)抓包的功能,所有不能使用普通的安卓應(yīng)用來實現(xiàn)這個功能,使用ndk也沒用,主要原因是android應(yīng)用的進程最高只有system權(quán)限,而開啟monitor模式需要和驅(qū)動層通訊需要有root權(quán)限。

所以需要使用linux下的可執(zhí)行程序?qū)崿F(xiàn),和ndk類似,只是不生成.so,編譯方法也需要做一些修改。另外這個程序還需要與應(yīng)用層通訊,可以使用socket。

liunx下可執(zhí)行程序。

眾所周知安卓是基于linux系統(tǒng)實現(xiàn),但很少有人在安卓系統(tǒng)下開發(fā)linux程序,一般編譯系統(tǒng)是會設(shè)計到,相關(guān)應(yīng)用也會編譯系統(tǒng)時一起編譯。

開發(fā)linux上的程序,需要用linux系統(tǒng),使用gcc編譯,另外由于音箱是arm架構(gòu)還需要使用交叉編譯,但使用通用的arm交叉編譯工具編譯的可執(zhí)行程序并不能再音箱上運行,具體原因未知,查看資料后說要使用從ndk中的分離交叉編譯工具,下載linux下的ndk并分離出交叉編譯工具后可編譯生成在安裝系統(tǒng)上運行的可執(zhí)行程序。

如果交叉編譯已經(jīng)如何分離ndk中的編譯工具可自行百度。

app_process

之前寫過在如何在安卓上運行java程序,不是一個apk而是命令行程序,另外還有如果彈出一個非比尋常的窗體。

android下可以通過命令行運行java代碼,就像windows或者linux下使用java命令運行后綴為.jar的java程序,只是android上的命令不是java而是app_process jar包的格式為dex。

app_process是一個命令號工具,作用就是啟動jvm加載并執(zhí)行dex文件。android系統(tǒng)啟動時根據(jù)傳入的參數(shù)會啟動zge進程zgz進程負(fù)責(zé)創(chuàng)建所有的安卓應(yīng)用的進程。

最近又看了之前的博文,又有個新的發(fā)現(xiàn),那就是這個程序是有root權(quán)限的。普通的安卓應(yīng)用都是由zg fork出來的,最高只有system權(quán)限。system權(quán)限可以修改系統(tǒng)的設(shè)置,但無法與驅(qū)動層通訊。如果linux下可執(zhí)行程序,運行程序時如果是root權(quán)限,那么這個進程也是root權(quán)限。使用app_process啟動的java程序時也是一樣。

所以也可以java來實現(xiàn)這樣的程序,因為java的語法比c簡單,如果程序比較復(fù)雜可以考慮使用java實現(xiàn),由于一鍵配置的程序并不復(fù)雜所以并沒有用java是用c++實現(xiàn)的。

如果開啟無線網(wǎng)卡monitor模式

繼續(xù)上面實現(xiàn)easyconfig的步驟,首先需要開啟網(wǎng)卡的monitor模式。

查看資料linux下有相應(yīng)的工具可以實現(xiàn),但這些命令在android系統(tǒng)上并不存在,我也嘗試將工具移植到android系統(tǒng)上,但編譯不了,總各種各樣的問題。

因此我需要去找這個monitor模式究竟是在那里控制的。

一開始我認(rèn)為對wifi數(shù)據(jù)的處理是在wifi驅(qū)動層實現(xiàn)的,音箱的wifi芯片默認(rèn)情況會接受環(huán)境下所有的數(shù)據(jù)包,驅(qū)動程序會根據(jù)數(shù)據(jù)包的目的地址過濾不屬于自己的數(shù)據(jù)。

于是我就去看無線網(wǎng)卡驅(qū)動,根據(jù)芯片型號,找到一份liunx的源碼,bcmdhd就是wifi的網(wǎng)卡驅(qū)動,重新編譯后盡然可以運行,于是找到接受數(shù)據(jù)的地方,并添加打印函數(shù),cat /proc/kmsg 可以看到驅(qū)動層的日志。 可惜的是,驅(qū)動層并沒有所有的wifi數(shù)據(jù),只有他自己的數(shù)據(jù)。

對wifi數(shù)據(jù)的過濾是在wifi芯片中完成的,通過查看bcm43362的資料得知,wifi芯片中也有處理程序,建立連接數(shù)據(jù)加密等操作都是由wifi芯片處理的,驅(qū)動程序只負(fù)責(zé)與wifi芯片進行通訊將數(shù)據(jù)發(fā)送到上層。

實際上處理建立連接操作(過濾不屬于自己的數(shù)據(jù))是mac層實現(xiàn),mac層的實現(xiàn)方式有2中,softmac和fullmac,softmac就是我一開始所認(rèn)為的那樣由驅(qū)動程序過濾不屬于自己的數(shù)據(jù),驅(qū)動層可以捕獲到其他設(shè)備發(fā)送出去的數(shù)據(jù)。fullmac是由wifi芯片來實現(xiàn)mac層的功能。而bcm43362使用的是fullmac,不能在驅(qū)動層捕獲數(shù)據(jù)。

bcmdhd驅(qū)動會加載一個bin文件,這個bin文件就是wifi芯片里的程序,wifi芯片里有mcu就相當(dāng)于一個嵌入式系統(tǒng)。我想是不是可以修改這個wifi里bin程序呢,這個bin文件又是從哪里來的。

通過搜索得知bcm有一個用于開發(fā)的sdk winced,于是我又去下載這個winced(博通的wifi業(yè)務(wù)已經(jīng)買給了cypress要在cypress的網(wǎng)站上下載)。

但實際上這個winced并沒有什么卵用,這個是給嵌入式設(shè)備用的,跟wifi芯片里的mcu沒有關(guān)系,這個是esp8266不一樣。

幸運的是cypress的論壇上有l(wèi)inux/android下如何使用他的wifi模塊的內(nèi)容,他們還提供用于調(diào)試的命令行工具名字叫wl,把這個wl push到音箱上是可以運行的,使用 "wl monitor on/off",可以開啟/關(guān)閉調(diào)試模式。

開啟monitor模式后,使用tcpdump抓包后可以看到有一堆數(shù)據(jù)出現(xiàn),關(guān)閉后就沒有任何數(shù)據(jù)(音箱沒有聯(lián)網(wǎng)),這就表示第一步已經(jīng)完成,無線網(wǎng)卡可以收到環(huán)境中所有的數(shù)據(jù)包。

那么接下來的問題就是如果抓包

其實抓包比較簡單,tcpdump是有源碼的,tcpdump是基于libpcap的,實際上使用pcap就可以了,下載pcap的源碼,交叉編譯可得到靜態(tài)文件libpcap.a,在應(yīng)用中引入這個靜態(tài)文件 。調(diào)用libpcap中的函數(shù)就可以實現(xiàn)抓包。

理論上libpcap.a放到ndk中,打包的apk中,普通的apk程序也可以實現(xiàn)抓包,但由于權(quán)限的問題,libpcap的函數(shù)會執(zhí)行失敗,如果可以讓安卓進程有root那樣就可以執(zhí)行,前面說過普通的安卓應(yīng)用最高只有system權(quán)限。

前面2步實現(xiàn)之后,后面就很容易,到這里再加入airkiss的靜態(tài)庫,將抓到的數(shù)據(jù)包傳入airkiss,再用airkiss提供的測試工具發(fā)送ssid和密碼,使用printf打印就可以看到,手機端發(fā)送過來的ssid和密碼。

現(xiàn)在智能音箱算是比較流行,也與一些賣開發(fā)板的,我知道的若琪的開發(fā)板也是采用博通的wifi芯片,一般給音箱配置聯(lián)網(wǎng)都是通過藍牙或者通過建立ap的方式,使用easyconfig的方式會更加方便。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI