8266wifi模塊開發(fā)詳解(三)Smartconfig配網(wǎng)
掃描二維碼
隨時隨地手機看文章
說明
設想這樣一種場景,我們一般用手機連上WiFi的過程需要知道WiFi的名稱(SSID)與密碼(password)。手機上就觸摸屏和輸入法可以直接連接上,但是要是一個設備沒有這些外設,又該如何使用呢?往往在嵌入式領域為了節(jié)約成本,都將數(shù)據(jù)直接通過網(wǎng)絡上傳至服務器,然后由服務器進行數(shù)據(jù)整理與顯示。這時就需要借助SmartConfig這項技術(shù)了。
再舉個實例,我們買了一個天貓精靈語音助手,想讓天貓精靈連接到我們自己的WiFi上。首先需要從官網(wǎng)上下載相應的APP,然后在保證手機已經(jīng)連接上網(wǎng)絡的基礎上,啟動APP連接網(wǎng)絡。天貓精靈會等待APP發(fā)送網(wǎng)絡名稱和密碼,而這些信息就是通過廣播的形式發(fā)送在無線網(wǎng)中,然后天貓精靈就可以啟動配置了。
原理
要弄清楚這個過程內(nèi)部是如何實現(xiàn)的,我們可以講一講smartconfig的實現(xiàn)。
smartconfig
在不同的廠商那里,有著不同的名稱,比如樂鑫與高通都稱為smartconfig,而在微信里稱為Airkiss,實際上都是一個意思。
在實現(xiàn)的過程中,就是將WiFi模塊處于AP+STA模式,然后手機APP將SSID與密碼編碼發(fā)送到UDP的報文中,通過廣播包或者組播包進行發(fā)送。WiFi模塊接收到UDP的報文后進行解碼,得到正確的SSID與密碼,然后進行設備聯(lián)網(wǎng),從而達到我們聯(lián)網(wǎng)的目的。
我們用一個簡單的圖來敘述這個過程
準確的說,smartconfig的技術(shù)本質(zhì)是UDP廣播,而這里的難點在于如果WiFi傳輸?shù)臄?shù)據(jù)不是加密的數(shù)據(jù),那么直接將UDP數(shù)據(jù)發(fā)過來就可以讓WiFi模塊解析到了,然而并不是這樣,由于路由器的加密方式不是固定的。所以這種辦法是行不通的。路由器的加密方式分為三種:WPA/WPA2、WPA-PSK/WPA2-PSK、WEP。
那么這種又該如何告知WiFi模塊呢?
先看一下協(xié)議封裝包的格式
這里可以利用的信息就是長度信息,其他的字段暫時不好使用。
舉個例子,假如我們需要發(fā)送“1,2,3”這個字符串,那么就可以將數(shù)據(jù)封成如下的包進行發(fā)送,因為1對應的ASCII碼的表為0x31,2對應的0x32。
但是,真實的數(shù)據(jù)是否是這樣呢?其實每個廠家都對編碼進行了加密,這就避免了破解或者其他的問題。比如wechat的AirKiss就與Espressif的SmartConfig不同。下面我們來詳細模擬一直傳輸規(guī)則。
分析
一般對于802.11幀,其實一幀數(shù)據(jù)的長度有幾個部分,密文的長度+20字節(jié)包頭+8字節(jié)UDP協(xié)議頭+算法常量。
因此我們可以制定一套標準的規(guī)則,由于輸出傳輸?shù)拈L度是2字節(jié),所以前面我們可以約定數(shù)據(jù)的開始與數(shù)據(jù)的結(jié)束,同時約定ASCII碼的規(guī)則進行加密。
頭部可以用0xF000作為標識。
0x1000 發(fā)三次表示數(shù)據(jù)開始
0x1FFF 發(fā)三次表示數(shù)據(jù)結(jié)束
0x1555 發(fā)三次表示數(shù)據(jù)間隔
0x1100 表示ASCII 0x00
.
.
0x117F 表示ASCII 0x7F
那么當我們需要發(fā)一個字符串hello時,我們就可以進行如下規(guī)則的發(fā)送
首先發(fā)送開始包的長度0x1000表示4096字節(jié),減去包的封裝信息(16+8+20)。所以填充在Length字段的數(shù)據(jù)長度為4052。
因為wifi的工作通道一般為1到13,如果不知道WiFi模塊處于哪個channel,智能定時的去切換了。比如每個通道上發(fā)送100ms,然后再切換到其他的通道上,這樣效率就很低了,所以配置網(wǎng)絡一般很慢。
如果要將提高配網(wǎng)的成功率,可以先掃描一下當前的AP,獲取到通道的信息,然后在這個通道上去監(jiān)聽UDP數(shù)據(jù)。這樣可以大幅度的提高配網(wǎng)的效率及成功率。
實現(xiàn)
工程構(gòu)建
目前可以用8266來做個實驗,我們還是采用PIO進行實驗。
進入里面有一個選項
只需將lib_deps復制到我們新創(chuàng)建的空的工程項目中即可
對于nodemcuv2的板子,可以配置如下
只需編譯即可。可能會提示找不到頭文件,在main.cpp文件中添加缺少的頭文件即可。
編譯通過了就可以了。接下來就是編譯工程了。我們剛才下載的工程在.piolibdeps中
其中在例程中有smartconfig這個文件夾,將其轉(zhuǎn)移到我們自己創(chuàng)立的工程文件中
通過代碼查看,發(fā)現(xiàn)如果要使用smartconfig,是需要開啟一個宏定義的。
開啟宏定義的選項在platformio.ini中
build_flags = -DJUSTWIFI_ENABLE_SMARTCONFIG
到這里,我們的基礎工程庫就配置好了。
然后編譯,下載到板子上。
通過串口調(diào)試助手查看信息。
查看等待連接。
APP操作
在樂鑫的官方網(wǎng)站上下載ESP TOUCH
其安裝包在releases中。
手機安裝后,打開界面如下所示
點擊CONFIRM開始進行配網(wǎng)操作。
配網(wǎng)成功后,串口調(diào)試助手打印出如下的信息
同時手機返回的消息如下,表示配網(wǎng)成功
此時WIFI模塊已經(jīng)連上wifi了。此時模塊就可以上網(wǎng)了。
分析
對于該模塊的分析,主要講一下代碼的結(jié)構(gòu)。
首先,模塊要開啟STA模式,然后開始smartconfig
這里就進入到庫函數(shù)的調(diào)用
這個宏會在_machine函數(shù)中,而_machine函數(shù)又在loop函數(shù)中,這樣就在loop函數(shù)中不斷的查詢狀態(tài)了。
最關(guān)鍵的是調(diào)用了WiFi.beginSmartConfig()。這才是進入smartconfig模式的關(guān)鍵。
總結(jié)
本文對smartconfig的原理及實現(xiàn)進行了詳細的描述。與此相同的還有Airkiss技術(shù),這些操作方式都是類似的。這種方式入網(wǎng)的好處不言而喻,簡單的說就是節(jié)約成本,方便操作,但是缺點也有,就是成功率不高,而且有可能泄漏密碼。但是真的好用就行。





