剛買回來一個智能音箱和博聯(lián),需要給音箱和博聯(lián)配置聯(lián)網(wǎng),音箱需要先打開藍(lán)牙,然后在手機(jī)app中填寫wifi的ssid和密碼,通過藍(lán)牙發(fā)送到音箱,音箱收到后連接到wifi。
成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、重慶網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)成都定制網(wǎng)頁設(shè)計(jì)等服務(wù)項(xiàng)目。核心團(tuán)隊(duì)均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗(yàn),服務(wù)眾多知名企業(yè)客戶;涵蓋的客戶類型包括:混凝土攪拌機(jī)等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗(yàn),同時(shí)也獲得了客戶的一致贊許!博聯(lián)就比較奇怪,進(jìn)入聯(lián)網(wǎng)模式以后,手機(jī)app上填寫wifi的ssid和密碼后,直接點(diǎn)配置按鈕后,博聯(lián)就連上了。要知道手機(jī)并沒有與這個設(shè)備建立連接,ssid和密碼不知道怎么就莫名其妙的被發(fā)送過去了。
仔細(xì)想了一下,應(yīng)該是通過wifi信號發(fā)送的,wifi本質(zhì)上是一種射頻信號,手機(jī)可以發(fā)送wifi信號,博聯(lián)上也有wifi芯片,理論上可以直接接受到手機(jī)的wifi信號而不需要經(jīng)過路由器。但究竟是怎么發(fā)送過去就不得而知。
經(jīng)過一番搜索后得知,這種技術(shù)叫做easyconfig或者smaterconfig、SmartConnect,不同的地方叫法不一樣,最早應(yīng)該是TI公司提供給博聯(lián)的。
原理就是手機(jī)發(fā)送udp廣播或者組播。博聯(lián)的無線網(wǎng)卡支持混雜模式,可以接收到環(huán)境中所有的wifi數(shù)據(jù)包,這樣手機(jī)在發(fā)送udp報(bào)文后就會被博聯(lián)捕獲到,但由于和路由器直接通訊的數(shù)據(jù)是加密的,博聯(lián)能捕獲到也并沒有什么卵用,這種的技術(shù)關(guān)鍵就在于使用長度字段來傳遞ssid和密碼信息。只需要規(guī)定編碼方式。
知道原理后,是否可以在音箱上實(shí)現(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ù)。
所有如果要在音箱上也實(shí)現(xiàn)easyconfig就需要開啟monitor模式然后抓包,然后再根據(jù)包的長度通過某種規(guī)則傳遞ssid和wifi密碼。
開啟monitor模式可以通過執(zhí)行wl指令(或者直接發(fā)送ioctl命令)。抓包可以使用開源的tcpdump,但是通過數(shù)據(jù)包長度編碼還沒有思路。
再查看easyconfig原理時(shí),發(fā)現(xiàn)微信有一個airkiss工具,提供一個.a的靜態(tài)庫,開啟monitor模式或混雜模式后,將收到的數(shù)據(jù)包交給airkiss,airkiss會處理解析數(shù)據(jù)的工作,airkiss也提供手機(jī)端的發(fā)送程序。
因此要實(shí)現(xiàn)easyconfig只需要實(shí)現(xiàn)如下功能就可以:
1.打開/關(guān)閉無線網(wǎng)卡monitor模式
2.使用tcpdump(libpcap)抓包
3.講抓包后收到數(shù)據(jù)后再調(diào)用airkiss的函數(shù)
4.手機(jī)端實(shí)現(xiàn)發(fā)送ssid和密碼的app,可使用微信airkiss提供的app測試
5.實(shí)現(xiàn)應(yīng)用層控制開啟/關(guān)閉,收到密碼后聯(lián)網(wǎng),聯(lián)網(wǎng)成功后通知手機(jī)端等功能
由于安卓系統(tǒng)中并沒有monitor模式或混雜模式相關(guān)的函數(shù),也無法實(shí)現(xiàn)抓包的功能,所有不能使用普通的安卓應(yīng)用來實(shí)現(xiàn)這個功能,使用ndk也沒用,主要原因是android應(yīng)用的進(jìn)程最高只有system權(quán)限,而開啟monitor模式需要和驅(qū)動層通訊需要有root權(quán)限。
所以需要使用linux下的可執(zhí)行程序?qū)崿F(xiàn),和ndk類似,只是不生成.so,編譯方法也需要做一些修改。另外這個程序還需要與應(yīng)用層通訊,可以使用socket。
liunx下可執(zhí)行程序。
眾所周知安卓是基于linux系統(tǒng)實(shí)現(xiàn),但很少有人在安卓系統(tǒng)下開發(fā)linux程序,一般編譯系統(tǒng)是會設(shè)計(jì)到,相關(guān)應(yīng)用也會編譯系統(tǒng)時(shí)一起編譯。
開發(fā)linux上的程序,需要用linux系統(tǒng),使用gcc編譯,另外由于音箱是arm架構(gòu)還需要使用交叉編譯,但使用通用的arm交叉編譯工具編譯的可執(zhí)行程序并不能再音箱上運(yùn)行,具體原因未知,查看資料后說要使用從ndk中的分離交叉編譯工具,下載linux下的ndk并分離出交叉編譯工具后可編譯生成在安裝系統(tǒng)上運(yùn)行的可執(zhí)行程序。
如果交叉編譯已經(jīng)如何分離ndk中的編譯工具可自行百度。
app_process
之前寫過在如何在安卓上運(yùn)行java程序,不是一個apk而是命令行程序,另外還有如果彈出一個非比尋常的窗體。
android下可以通過命令行運(yùn)行java代碼,就像windows或者linux下使用java命令運(yùn)行后綴為.jar的java程序,只是android上的命令不是java而是app_process jar包的格式為dex。
app_process是一個命令號工具,作用就是啟動jvm加載并執(zhí)行dex文件。android系統(tǒng)啟動時(shí)根據(jù)傳入的參數(shù)會啟動zge進(jìn)程zgz進(jìn)程負(fù)責(zé)創(chuàng)建所有的安卓應(yīng)用的進(jìn)程。
最近又看了之前的博文,又有個新的發(fā)現(xiàn),那就是這個程序是有root權(quán)限的。普通的安卓應(yīng)用都是由zg fork出來的,最高只有system權(quán)限。system權(quán)限可以修改系統(tǒng)的設(shè)置,但無法與驅(qū)動層通訊。如果linux下可執(zhí)行程序,運(yùn)行程序時(shí)如果是root權(quán)限,那么這個進(jìn)程也是root權(quán)限。使用app_process啟動的java程序時(shí)也是一樣。
所以也可以java來實(shí)現(xiàn)這樣的程序,因?yàn)閖ava的語法比c簡單,如果程序比較復(fù)雜可以考慮使用java實(shí)現(xiàn),由于一鍵配置的程序并不復(fù)雜所以并沒有用java是用c++實(shí)現(xiàn)的。
如果開啟無線網(wǎng)卡monitor模式
繼續(xù)上面實(shí)現(xiàn)easyconfig的步驟,首先需要開啟網(wǎng)卡的monitor模式。
查看資料linux下有相應(yīng)的工具可以實(shí)現(xiàn),但這些命令在android系統(tǒng)上并不存在,我也嘗試將工具移植到android系統(tǒng)上,但編譯不了,總各種各樣的問題。
因此我需要去找這個monitor模式究竟是在那里控制的。
一開始我認(rèn)為對wifi數(shù)據(jù)的處理是在wifi驅(qū)動層實(shí)現(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ū)動,重新編譯后盡然可以運(yùn)行,于是找到接受數(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芯片進(jìn)行通訊將數(shù)據(jù)發(fā)送到上層。
實(shí)際上處理建立連接操作(過濾不屬于自己的數(shù)據(jù))是mac層實(shí)現(xiàn),mac層的實(shí)現(xiàn)方式有2中,softmac和fullmac,softmac就是我一開始所認(rèn)為的那樣由驅(qū)動程序過濾不屬于自己的數(shù)據(jù),驅(qū)動層可以捕獲到其他設(shè)備發(fā)送出去的數(shù)據(jù)。fullmac是由wifi芯片來實(shí)現(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)站上下載)。
但實(shí)際上這個winced并沒有什么卵用,這個是給嵌入式設(shè)備用的,跟wifi芯片里的mcu沒有關(guān)系,這個是esp8266不一樣。
幸運(yùn)的是cypress的論壇上有l(wèi)inux/android下如何使用他的wifi模塊的內(nèi)容,他們還提供用于調(diào)試的命令行工具名字叫wl,把這個wl push到音箱上是可以運(yùn)行的,使用 "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ù)包。
那么接下來的問題就是如果抓包
其實(shí)抓包比較簡單,tcpdump是有源碼的,tcpdump是基于libpcap的,實(shí)際上使用pcap就可以了,下載pcap的源碼,交叉編譯可得到靜態(tài)文件libpcap.a,在應(yīng)用中引入這個靜態(tài)文件 。調(diào)用libpcap中的函數(shù)就可以實(shí)現(xiàn)抓包。
理論上libpcap.a放到ndk中,打包的apk中,普通的apk程序也可以實(shí)現(xiàn)抓包,但由于權(quán)限的問題,libpcap的函數(shù)會執(zhí)行失敗,如果可以讓安卓進(jìn)程有root那樣就可以執(zhí)行,前面說過普通的安卓應(yīng)用最高只有system權(quán)限。
前面2步實(shí)現(xiàn)之后,后面就很容易,到這里再加入airkiss的靜態(tài)庫,將抓到的數(shù)據(jù)包傳入airkiss,再用airkiss提供的測試工具發(fā)送ssid和密碼,使用printf打印就可以看到,手機(jī)端發(fā)送過來的ssid和密碼。
現(xiàn)在智能音箱算是比較流行,也與一些賣開發(fā)板的,我知道的若琪的開發(fā)板也是采用博通的wifi芯片,一般給音箱配置聯(lián)網(wǎng)都是通過藍(lán)牙或者通過建立ap的方式,使用easyconfig的方式會更加方便。