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,具体说明请参考官方说明文档

  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]=7;     //数据长度
  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]=7;     //数据长度
  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

到这里表示配网成功……

猜你喜欢

转载自blog.csdn.net/LinQiPing233/article/details/83444055