ESP32的SDK開發之blufi一鍵配網

---牧馬人---發表於2018-10-27

 

 

        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,具體說明請參考官方說明文件

  1.      Byte[0]=0x01;      //載入命令,0x01為資料命令,0x00為控制命令
  2.      Byte[0]=(0x03<<2) |  Byte[0];      //載入資料幀,0x03表示傳送AP的password
  3.      Byte[1]=0x00;      //載入幀控制域,無檢驗,無加密
  4.      Byte[2]=sequence++;     //序列控制域,沒傳送一次加1
  5.      Byte[3]=8;     //資料長度
  6.      Byte[4]='p';     //data1,密碼
  7.      Byte[5]='a';     //data2,密碼
  8.      Byte[6]='s';     //data3,密碼
  9.      Byte[7]='s';     /data4,/密碼
  10.      Byte[8]='w';     //data5,密碼
  11.      Byte[9]='o';     //data6,密碼
  12.      Byte[10]='r';     //data7,密碼
  13.      Byte[11]='d';     //data8,密碼
  14.      Byte[12]=checksumLSB;     //data7,檢驗低位,無檢驗可以不要
  15.      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,具體說明請參考官方說明文件

  1.      Byte[0]=0x01;      //載入命令,0x01為資料命令,0x00為控制命令
  2.      Byte[0]=(0x02<<2) |  Byte[0];      //載入資料幀,0x02表示傳送AP的SSID
  3.      Byte[1]=0x00;      //載入幀控制域,無檢驗,無加密
  4.      Byte[2]=sequence++;     //序列控制域,沒傳送一次加1
  5.      Byte[3]=4;     //資料長度
  6.      Byte[4]='m';     //data1,密碼
  7.      Byte[5]='y';     //data2,密碼
  8.      Byte[6]='A';     //data3,密碼
  9.      Byte[7]='P';     /data4,/密碼
  10.      Byte[8]=checksumLSB;     //data7,檢驗低位,無檢驗可以不要
  11.      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,具體說明請參考官方說明文件

  1.      Byte[0]=0x00;      //載入命令,0x01為資料命令,0x00為控制命令
  2.      Byte[0]=(0x03<<2) |  Byte[0];      //載入控制幀,0x03表示連線AP
  3.      Byte[1]=0x00;      //載入幀控制域,無檢驗,無加密
  4.      Byte[2]=sequence++;     //序列控制域,每傳送一次加1
  5.      Byte[3]=7;     //資料長度,控制幀無需data
  6.      Byte[4]='m';     //data1,密碼,控制幀無需data
  7.      Byte[5]='y';     //data2,密碼,控制幀無需data
  8.      Byte[6]='A';     //data3,密碼,控制幀無需data
  9.      Byte[7]='P';     /data4,/密碼,控制幀無需data
  10.      Byte[8]=checksumLSB;     //data7,檢驗低位,無檢驗可以不要
  11.      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

到這裡表示配網成功……

相關文章