ESP32的SDK開發之blufi一鍵配網
ESP32 是整合 2.4 GHz Wi-Fi 和藍芽雙模的單晶片方案,採用臺積電 (TSMC) 超低功耗的 40 納米工藝,擁有最 佳的功耗效能、射頻效能、穩定性、通用性和可靠性,適用於各種應用和不同功耗需求。
ESP32這款模組可以說在物聯網開發硬體中價效比極高的,開發應用可以說無所不能了,這裡就不一一介紹了。
ESP32支援一鍵配網方式有3中,airkiss、smartconfig、blufi,本文主要講講blufi這種方式。
由於加密和檢驗過程較為繁瑣,暫時採用無檢驗無加密的方式實現。
blufi是基於低功耗藍芽BLE實現的一種配網方式,下面來詳細解答一下樂鑫官方blufi的協議,官方說明文件。
傳輸格式
Description | Value |
---|---|
LSB - Type | 1 |
Frame Control | 1 |
Sequence Number | 1 |
Data Length | 1 |
Data | ${Data Length} |
MSB - CheckSum | 2 |
1、Type
型別域,佔 1 byte。分為 Type 和 Subtype(子型別域)兩部分, Type 佔低 2 bit,Subtype 佔高 6 bit。
Type(低 2 bit):=0,為控制命令,=1,為資料命令
Subtype (高 6 bit):根據低2位的Type命令選擇相應的Subtype,具體見官方說明文件。
2、Frame Control
幀控制域,佔 1 byte,每個 bit 表示不同含義,具體見官方說明文件。
3、Sequence Control
序列控制域。幀傳送時,無論幀的型別是什麼,序列 (Sequence) 都會自動加 1,用來防止重放攻擊 (Replay Attack)。每次重現連線後,序列清零。
4、Length
Data 域的長度,不包含 CheckSum。
5、Data
不同的 Type 或 Subtype,Data 域的含義均不同。請參考官方說明文件。
6、CheckSum
此域為 2 byte 的校驗,用來校驗『序列 + 資料長度 + 明文資料』。
軟體實現:位置:blufilibrary->java->blufi.espressif->BlufiClientlmpl.java->getPostBytes()
具體軟體實現操作
1、ESP32進入blufi模式
串列埠列印
[0;32mI (12509942) BLUFI_EXAMPLE: BD ADDR: 30:ae:a4:f1:ee:7e
[0m
[0;32mI (12509952) BLUFI_EXAMPLE: BLUFI VERSION 0102
[0m
[0;32mI (12509952) BLUFI_EXAMPLE: BLUFI init finish
[0m
[0;32mI (12515562) BLUFI_EXAMPLE: BLUFI ble connect
[0m
2、藍芽連線成功
串列埠列印
[0;32mI (12515562) BLUFI_EXAMPLE: BLUFI ble connect
[0m
3、手機發送將要連線的AP的password,具體說明請參考官方說明文件。
- Byte[0]=0x01; //載入命令,0x01為資料命令,0x00為控制命令
- Byte[0]=(0x03<<2) | Byte[0]; //載入資料幀,0x03表示傳送AP的password
- Byte[1]=0x00; //載入幀控制域,無檢驗,無加密
- Byte[2]=sequence++; //序列控制域,沒傳送一次加1
- Byte[3]=7; //資料長度
- Byte[4]='p'; //data1,密碼
- Byte[5]='a'; //data2,密碼
- Byte[6]='s'; //data3,密碼
- Byte[7]='s'; /data4,/密碼
- Byte[8]='w'; //data5,密碼
- Byte[9]='o'; //data6,密碼
- Byte[10]='r'; //data7,密碼
- Byte[11]='d'; //data8,密碼
Byte[12]=checksumLSB; //data7,檢驗低位,無檢驗可以不要Byte[13]=checksumHSB; //data8,檢驗高位,無檢驗可以不要
串列埠列印
協議出錯,error code 1表示檢驗出錯
[0;31mE (12704272) BT_BTC: btc_blufi_recv_handler checksum error 7478, pkt 0262
[0m
[0;31mE (12704272) BLUFI_EXAMPLE: BLUFI report error, error code 1
[0m
傳送成功
[0;32mI (12978592) BLUFI_EXAMPLE: Recv STA PASSWORD password
[0m
4、手機發送將要連線的AP的SSID,具體說明請參考官方說明文件。
- Byte[0]=0x01; //載入命令,0x01為資料命令,0x00為控制命令
- Byte[0]=(0x02<<2) | Byte[0]; //載入資料幀,0x02表示傳送AP的SSID
- Byte[1]=0x00; //載入幀控制域,無檢驗,無加密
- Byte[2]=sequence++; //序列控制域,沒傳送一次加1
- Byte[3]=7; //資料長度
- Byte[4]='m'; //data1,密碼
- Byte[5]='y'; //data2,密碼
- Byte[6]='A'; //data3,密碼
- Byte[7]='P'; /data4,/密碼
Byte[8]=checksumLSB; //data7,檢驗低位,無檢驗可以不要Byte[9]=checksumHSB; //data8,檢驗高位,無檢驗可以不要
串列埠列印
協議出錯,error code 1表示檢驗出錯
[0;31mE (12704272) BT_BTC: btc_blufi_recv_handler checksum error 7478, pkt 0262
[0m
[0;31mE (12704272) BLUFI_EXAMPLE: BLUFI report error, error code 1
[0m
傳送成功
[0;32mI (13109342) BLUFI_EXAMPLE: Recv STA SSID myAP
[0m
5、ESP32模組開始連線AP,具體說明請參考官方說明文件。
- Byte[0]=0x00; //載入命令,0x01為資料命令,0x00為控制命令
- Byte[0]=(0x03<<2) | Byte[0]; //載入控制幀,0x03表示連線AP
- Byte[1]=0x00; //載入幀控制域,無檢驗,無加密
- Byte[2]=sequence++; //序列控制域,沒傳送一次加1
Byte[3]=7; //資料長度,控制幀無需dataByte[4]='m'; //data1,密碼,控制幀無需dataByte[5]='y'; //data2,密碼,控制幀無需dataByte[6]='A'; //data3,密碼,控制幀無需dataByte[7]='P'; /data4,/密碼,控制幀無需dataByte[8]=checksumLSB; //data7,檢驗低位,無檢驗可以不要Byte[9]=checksumHSB; //data8,檢驗高位,無檢驗可以不要
串列埠列印
協議出錯,error code 1表示檢驗出錯
[0;31mE (12704272) BT_BTC: btc_blufi_recv_handler checksum error 7478, pkt 0262
[0m
[0;31mE (12704272) BLUFI_EXAMPLE: BLUFI report error, error code 1
[0m
傳送成功,如果wifi名稱和密碼正確,伺服器沒問題,後續就會有下面的串列埠列印,同時模組會把模組的mac地址和連線的AP名稱反饋回來,如下圖是安卓客戶端的介面
[0;32mI (13528252) BLUFI_EXAMPLE: BLUFI requset wifi connect to AP
[0m
I (13528382) wifi: n:1 1, o:1 0, ap:255 255, sta:1 1, prof:1
I (13529382) wifi: state: init -> auth (b0)
I (13529382) wifi: state: auth -> assoc (0)
I (13529392) wifi: state: assoc -> run (10)
I (13529632) wifi: connected with guichuankeji, channel 1
I (13529632) wifi: pm start, type: 1
[0;32mI (13530432) event: sta ip: 192.168.1.100, mask: 255.255.255.0, gw: 192.168.1.1[0m
[0;31mE (13530432) MQTT_EXAMPLE: Start MQTT_TCP……[0m
[0;32mI (13530432) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE[0m
[0;32mI (13532642) MQTT_CLIENT: Sending MQTT CONNECT message, type: 1, id: 0000[0m
[0;32mI (13532942) MQTT_EXAMPLE: MQTT_EVENT_CONNECTED[0m
[0;32mI (13532952) MQTT_EXAMPLE: sent subscribe successful, msg_id=35098[0m
[0;32mI (13533122) MQTT_EXAMPLE: MQTT_EVENT_SUBSCRIBED, msg_id=35098[0m
到這裡表示配網成功……