8266wifi模塊開發(fā)詳解(三)Smartconfig配網(wǎng)
掃描二維碼
隨時隨地手機(jī)看文章
說明
設(shè)想這樣一種場景,我們一般用手機(jī)連上WiFi的過程需要知道WiFi的名稱(SSID)與密碼(password)。手機(jī)上就觸摸屏和輸入法可以直接連接上,但是要是一個設(shè)備沒有這些外設(shè),又該如何使用呢?往往在嵌入式領(lǐng)域為了節(jié)約成本,都將數(shù)據(jù)直接通過網(wǎng)絡(luò)上傳至服務(wù)器,然后由服務(wù)器進(jìn)行數(shù)據(jù)整理與顯示。這時就需要借助SmartConfig這項技術(shù)了。
再舉個實例,我們買了一個天貓精靈語音助手,想讓天貓精靈連接到我們自己的WiFi上。首先需要從官網(wǎng)上下載相應(yīng)的APP,然后在保證手機(jī)已經(jīng)連接上網(wǎng)絡(luò)的基礎(chǔ)上,啟動APP連接網(wǎng)絡(luò)。天貓精靈會等待APP發(fā)送網(wǎng)絡(luò)名稱和密碼,而這些信息就是通過廣播的形式發(fā)送在無線網(wǎng)中,然后天貓精靈就可以啟動配置了。
原理
要弄清楚這個過程內(nèi)部是如何實現(xiàn)的,我們可以講一講smartconfig的實現(xiàn)。
smartconfig
在不同的廠商那里,有著不同的名稱,比如樂鑫與高通都稱為smartconfig,而在微信里稱為Airkiss,實際上都是一個意思。
在實現(xiàn)的過程中,就是將WiFi模塊處于AP+STA模式,然后手機(jī)APP將SSID與密碼編碼發(fā)送到UDP的報文中,通過廣播包或者組播包進(jìn)行發(fā)送。WiFi模塊接收到UDP的報文后進(jìn)行解碼,得到正確的SSID與密碼,然后進(jìn)行設(shè)備聯(lián)網(wǎng),從而達(dá)到我們聯(lián)網(wǎng)的目的。
我們用一個簡單的圖來敘述這個過程

準(zhǔn)確的說,smartconfig的技術(shù)本質(zhì)是UDP廣播,而這里的難點(diǎn)在于如果WiFi傳輸?shù)臄?shù)據(jù)不是加密的數(shù)據(jù),那么直接將UDP數(shù)據(jù)發(fā)過來就可以讓W(xué)iFi模塊解析到了,然而并不是這樣,由于路由器的加密方式不是固定的。所以這種辦法是行不通的。路由器的加密方式分為三種:WPA/WPA2、WPA-PSK/WPA2-PSK、WEP。
那么這種又該如何告知WiFi模塊呢?
先看一下協(xié)議封裝包的格式

這里可以利用的信息就是長度信息,其他的字段暫時不好使用。

舉個例子,假如我們需要發(fā)送“1,2,3”這個字符串,那么就可以將數(shù)據(jù)封成如下的包進(jìn)行發(fā)送,因為1對應(yīng)的ASCII碼的表為0x31,2對應(yīng)的0x32。

但是,真實的數(shù)據(jù)是否是這樣呢?其實每個廠家都對編碼進(jìn)行了加密,這就避免了破解或者其他的問題。比如wechat的AirKiss就與Espressif的SmartConfig不同。下面我們來詳細(xì)模擬一直傳輸規(guī)則。
分析
一般對于802.11幀,其實一幀數(shù)據(jù)的長度有幾個部分,密文的長度+20字節(jié)包頭+8字節(jié)UDP協(xié)議頭+算法常量。
因此我們可以制定一套標(biāo)準(zhǔn)的規(guī)則,由于輸出傳輸?shù)拈L度是2字節(jié),所以前面我們可以約定數(shù)據(jù)的開始與數(shù)據(jù)的結(jié)束,同時約定ASCII碼的規(guī)則進(jìn)行加密。

頭部可以用0xF000作為標(biāo)識。
0x1000 發(fā)三次表示數(shù)據(jù)開始
0x1FFF 發(fā)三次表示數(shù)據(jù)結(jié)束
0x1555 發(fā)三次表示數(shù)據(jù)間隔
0x1100 表示ASCII 0x00
.
.
0x117F 表示ASCII 0x7F
那么當(dāng)我們需要發(fā)一個字符串hello時,我們就可以進(jìn)行如下規(guī)則的發(fā)送
首先發(fā)送開始包的長度0x1000表示4096字節(jié),減去包的封裝信息(16+8+20)。所以填充在Length字段的數(shù)據(jù)長度為4052。
因為wifi的工作通道一般為1到13,如果不知道WiFi模塊處于哪個channel,智能定時的去切換了。比如每個通道上發(fā)送100ms,然后再切換到其他的通道上,這樣效率就很低了,所以配置網(wǎng)絡(luò)一般很慢。
如果要將提高配網(wǎng)的成功率,可以先掃描一下當(dāng)前的AP,獲取到通道的信息,然后在這個通道上去監(jiān)聽UDP數(shù)據(jù)。這樣可以大幅度的提高配網(wǎng)的效率及成功率。
實現(xiàn)
工程構(gòu)建
目前可以用8266來做個實驗,我們還是采用PIO進(jìn)行實驗。

進(jìn)入里面有一個選項

只需將lib_deps復(fù)制到我們新創(chuàng)建的空的工程項目中即可

對于nodemcuv2的板子,可以配置如下

只需編譯即可??赡軙崾菊也坏筋^文件,在main.cpp文件中添加缺少的頭文件即可。
編譯通過了就可以了。接下來就是編譯工程了。我們剛才下載的工程在.piolibdeps中

其中在例程中有smartconfig這個文件夾,將其轉(zhuǎn)移到我們自己創(chuàng)立的工程文件中

通過代碼查看,發(fā)現(xiàn)如果要使用smartconfig,是需要開啟一個宏定義的。
開啟宏定義的選項在platformio.ini中
build_flags = -DJUSTWIFI_ENABLE_SMARTCONFIG

到這里,我們的基礎(chǔ)工程庫就配置好了。
然后編譯,下載到板子上。

通過串口調(diào)試助手查看信息。

查看等待連接。
APP操作
在樂鑫的官方網(wǎng)站上下載ESP TOUCH

其安裝包在releases中。

手機(jī)安裝后,打開界面如下所示

點(diǎn)擊CONFIRM開始進(jìn)行配網(wǎng)操作。
配網(wǎng)成功后,串口調(diào)試助手打印出如下的信息

同時手機(jī)返回的消息如下,表示配網(wǎng)成功

此時WIFI模塊已經(jīng)連上wifi了。此時模塊就可以上網(wǎng)了。
分析
對于該模塊的分析,主要講一下代碼的結(jié)構(gòu)。
首先,模塊要開啟STA模式,然后開始smartconfig

這里就進(jìn)入到庫函數(shù)的調(diào)用

這個宏會在_machine函數(shù)中,而_machine函數(shù)又在loop函數(shù)中,這樣就在loop函數(shù)中不斷的查詢狀態(tài)了。

最關(guān)鍵的是調(diào)用了WiFi.beginSmartConfig()。這才是進(jìn)入smartconfig模式的關(guān)鍵。
總結(jié)
本文對smartconfig的原理及實現(xiàn)進(jìn)行了詳細(xì)的描述。與此相同的還有Airkiss技術(shù),這些操作方式都是類似的。這種方式入網(wǎng)的好處不言而喻,簡單的說就是節(jié)約成本,方便操作,但是缺點(diǎn)也有,就是成功率不高,而且有可能泄漏密碼。但是真的好用就行。