概览

BluFi 是一款基于蓝牙通道的 Wi-Fi 网络配置功能,适用于 ESP32。它通过安全协议将 Wi-Fi 配置和证书传输到 ESP32,然后 ESP32 可基于这些信息连接到 AP 或建立 SoftAP。

BluFi 流程的关键部分包括数据的分片、加密、校验和验证。

用户可按需自定义用于对称加密、非对称加密和校验的算法。这里我们采用 DH 算法进行密钥协商、128-AES 算法用于数据加密、CRC16 算法用于校验和验证。

BluFi 流程

BluFi 配网功能包含配置 SoftAP 和 Station 两部分。

下面以配置 Station 为例说明配置步骤。 BluFi 配网的配置 Station 包含广播、连接、服务发现、协商共享密钥、传输数据、回传连接状态等步骤。

ESP32 配网流程

  1. ESP32 开启 GATT Server 功能,发送带有特定 adv data 的广播。你可以自定义该广播,该广播不属于 BluFi Profile。
  2. 使用手机 APP 搜索到该特定广播,手机作为 GATT Client 连接 ESP32。你可以决定使用哪款手机 APP。
  3. GATT 连接建立成功后,手机向 ESP32 发送“协商过程”数据帧(详情见 BluFi 传输格式 )。
  4. ESP32 收到“协商过程”数据帧后,会按照使用者自定义的协商过程来解析。
  5. 手机与 ESP32 进行密钥协商。协商过程可使用 DH/RSA/ECC 等加密算法进行。
  6. 协商结束后,手机端向 ESP32 发送“设置安全模式”控制帧。
  7. ESP32 收到“设置安全模式”控制帧后,使用经过协商的共享密钥以及配置的安全策略对通信数据进行加密和解密。
  8. 手机向 ESP32 发送“BluFi 传输格式”定义的 SSID、Password 等用于 Wi-Fi 连接的必要信息。
  9. 手机向 ESP32 发送“Wi-Fi 连接请求”控制帧,ESP32 收到之后,识别为手机已将必要的信息传输完毕,准备连接 Wi-Fi。
  10. ESP32 连接到 Wi-Fi 后,发送“Wi-Fi 连接状态报告”控制帧到手机,以报告连接状态。至此配网结束。

注解

  1. 安全模式设置可在任何时候进行,ESP32 收到安全模式的配置后,会根据安全模式指定的模式进行安全相关的操作。
  2. 进行对称加密和解密时,加密和解密前后的数据长度必须一致,支持原地加密和解密。

配网流程图

BluFi Flow Chart

BluFi 传输格式

手机 APP 与 ESP32 之间的 BluFi 通信格式定义如下:

帧不分片情况下的标准格式 (8 bit):

Description Value
LSB - Type 1
Frame Control 1
Sequence Number 1
Data Length 1
Data ${Data Length}
MSB - CheckSum 2

如果 Frame Control 帧中的 More Frag 使能,则 Total Content Length 为数据帧中剩余部分的总长度,用于报告终端需要分配多少内存。

帧分片格式(8 bit):

Description Value
LSB - Type 1
FrameControl(Frag) 1
SequenceNumber 1
DataLength 1
Data Total Content Length 2
Content ${Data Length} - 2
MSB - CheckSum 2

通常情况下,控制帧不包含数据位,Ack 帧类型除外。

Ack 帧格式(8 bit):

Description Value
LSB - Type (Ack) 1
Frame Control 1
SequenceNumber 1
DataLength 1
Data Acked Sequence Number 2
MSB - CheckSum 2
  1. Type

    类型域,占 1 byte。分为 Type 和 Subtype(子类型域)两部分, Type 占低 2 bit,Subtype 占高 6 bit。

    • 控制帧,暂不进行加密,可校验;
    • 数据帧,可加密,可校验。

1.1 控制帧 (0x0 b’00)

控制帧 (二进制) 含义 解释 备注
0x0 (b’000000) Ack 用来回复对方发的帧, Ack 帧的 Data 域使用回复对象帧的 Sequence 值。 Data 域使用1 byte Sequence 值, 与恢复对象帧的Sequence 值相同。
0x1 (b’000001) Set ESP32 to the security mode. 通知 ESP32 发送数据时使用的安全模式, 在该过程中可设置多次,每次设置后影响后续安全模式。 在不设置的情况下,ESP32 默认控制帧和数据帧均为无校验、无加密。 手机到 ESP32 方向依赖于帧 Control 域。 Data 域占用 1 byte。 高 4 bit 为控制帧的安全模式,低 4bit 为数据帧的安全模式。
b’0000:无校验、无加密;
b’0001:有校验、无加密;
b’0010:无校验、有加密;
b’0011:有校验、有加密。
0x2 (b’000010) Set the Wi-Fi opmode of ESP32. 设置 ESP32 的 Wi-Fi 模式,帧包含 opmode 信息。 data[0] 用于表示 opmode 类型,包括:
0x00: NULL;
0x01: STA;
0x02: SoftAP;
0x03: SoftAP&STA.
如果设置有包含 AP,请尽量优先 设置 AP 模式的SSID/Password/Max Conn Number 等。
0x3 (b’000011) Connect ESP32 to the AP. 通知 ESP32,必要的信息已经发送完毕,可以连接 AP。 不包含 Data 域。
0x4 (b’000100) Disconnect ESP32 from the AP. 通知 ESP32 断开与 AP 的连接 不包含 Data 域。
0x5 (b’000101) Get the status of Wi-Fi. 获取 ESP32 的 Wi-Fi 模式和状态等信息。 不包含 Data 域。 ESP32 收到此控制帧后,后续会通过 Wi-Fi 连接状态 报告 (Wi-Fi Connection State Report) 数据帧来回复手机端当前 所处的 opmode、连接状态、SSID 等信息。提供给手机端的信息由应用决定。
0x6 (b’000110) Disconnect the STA device from the SoftAP in SoftAP mode. 处于 SoftAP 模式时,踢掉某个 STA 设备。 data[0~5] 为 STA 设备的 MAC 地址, 如有多个 STA,则 [6-11] 为第二个,依次类推。
0x7 (b‘000111) Get the version.    
0x8 (b’001000) Tell ESP32 to disconnect the BLE GATT link. 通知 ESP32 断开蓝牙连接。 ESP32 收到该指令后主动断开蓝牙连接。
0x9 (b’001001) Tell ESP32 to get the Wi-Fi list. 通知 ESP32 扫描周围的 Wi-Fi 热点 不包含 Data 域。 ESP32 收到此控制帧后,会发送包含 Wi-Fi 热点 报告 (Wi-Fi List Report) 的数据帧回复 手机端 ESP32 周围的 Wi-Fi 热点。

1.2 数据帧 (0x1 b’01)

数据帧 (二进制) 含义 解释 备注
0x0 (b’000000) Negotiation data. 用来发送协商数据,传输到应用层注册的回调函数。 数据长度与 Length 域有关。
0x1 (b’000001) BSSID for STA mode. STA 将要连接的 AP 的 BSSID(用于隐藏SSID)。 数据长度与 Length 域有关。
当传输方向为 ESP32 到手机时, 表示向手机端提供信息。
0x2 (b’000010) SSID for STA mode. STA 将要连接的 AP 的 SSID。 数据长度与 Length 域有关。
当传输方向为 ESP32 到手机时, 表示向手机端提供信息。
0x3 (b’000011) Password for STA mode. STA 将要连接的 AP 的密码。 数据长度与 Length 域有关。
当传输方向为 ESP32 到手机时, 表示向手机端提供信息。
0x4 (b’000100) SSID for SoftAP mode. SoftAP 模式使用的 SSID。 数据长度与 Length 域有关。
当传输方向为 ESP32 到手机时, 表示向手机端提供信息。
0x5 (b’000101) Password for SoftAPmode. SoftAP 模式使用的密码。 数据长度与 Length 域有关。
当传输方向为 ESP32 到手机时, 表示向手机端提供信息。
0x6 (b’000110) Max connection number for SoftAP mode. AP 模式的最大连接数。 data[0] 表示连接数的值,范围 1~4。
当传输方向为 ESP32 到手机时, 表示向手机端提供信息。
0x7 (b’000111) Authentication mode for SoftAP mode. AP 模式的认证模式。 data[0]:
0x00: OPEN;
0x01: WEP;
0x02: WPA_PSK;
0x03: WPA2_PSK;
0x04: WPA_WPA2_PSK.
当传输方向为 ESP32 到手机时, 表示向手机端提供信息。
0x8 (b’001000) Channel for SoftAP mode. SoftAP 模式的通道数量。 data[0] 表示通道的数量,范围 1~14。
当传输方向为 ESP32 到手机时, 表示向手机端提供信息。
0x9 (b’001001) Username. 使用企业级加密时,Client 端的用户名。 数据长度与 Length 域有关。
0xa (b’001010) CA certification. 进行企业级加密时使用的 CA 证书。 数据长度与 Length 域有关, 长度不够,可用分片。
0xb (b’001011) Client certification. 进行企业级加密时,Client 端的证书。 数据长度与 Length 域有关, 长度不够,可用分片。
可包含或不包含私钥,由证书内容决定。
0xc (b’001100) Server certification. 进行企业级加密时,Server 端的证书。 数据长度与 Length 域有关, 长度不够,可用分片。
可包含或不包含私钥,由证书内容决定。
0xd (b’001101) Client private key. 进行企业级加密时,Client 端的私钥。 数据长度与 Length 域有关, 长度不够,可用分片。
0xe (b’001110) Server private key. 进行企业级加密时,Server 端的私钥。 数据长度与 Length 域有关, 长度不够,可用分片。
0xf (b’001111) Wi-Fi connection state report. 通知手机 ESP32 的 Wi-Fi 状态, 包括 STA状态和 SoftAP 状态, 用于手机配置 STA 连接时的通知, 或有 STA 连接上 SoftAP 时的通知。 data[0] 表示 opmode,包括:
但收到手机询问 Wi-Fi 状态时, 除了回复此帧外,还可回复其他数据帧。 0x00: NULL;
0x01: STA;
0x02: SoftAP;
0x03: SoftAP&STA
data[1]:STA 的连接状态, 0x0 表示处于连接状态, 其他表示处于非连接状态;
data[2]:SoftAP 的连接状态, 即表示有多少 STA 已经连接。
data[3] 及以后:为按照本协议格式 SSIDBSSID 等信息。
0x10 b’010000 Version.   data[0]= great version
data[1]=sub version
0x11 (b’010001) Wi-Fi list. 通知手机 ESP32 周围的 Wi-Fi 热点列表。 数据帧数据格式为 Length + RSSI + SSID, 数据较长时可分片发送。
0x12 (b’010010) Report error. 通知手机 BluFi 过程出现异常错误。 0x00: sequence error;
0x01: checksum error;
0x02: decrypt error;
0x03: encrypt error;
0x04: init security error;
0x05: dh malloc error;
0x06: dh param error;
0x07: read param error;
0x08: make public error.
0x13 (b’010011) Custom data. 用户发送或者接收自定义数据。 数据较长时可分片发送。
  1. Frame Control

    帧控制域,占 1 byte,每个 bit 表示不同含义。

    含义
    0x01 表示帧是否加密。
    1 表示加密,0 表示未加密。
    加密部分帧括完整的 DATA 域加密之前的明文(不帧含末尾的校验)。
    控制帧暂不加密,故控制帧此位为 0。
    0x02 表示帧 Data 域结尾是否帧含校验(例如 SHA1,MD5,CRC等)需要校验的数据域包括 sequcne + data length + 明文 data。
    控制帧和数据帧都可以包含校验位或不包含。
    0x04 表示数据方向。
    0 表示手机发向 ESP32;
    1 表示 ESP32 发向手机。
    0x08 表示是否要求对方回复 ack。
    0 表示不要求;
    1 表示要求回复 ack。
    0x10 表示是否有后续的数据分片。
    0 表示此帧没有后续数据分片;
    1 表示还有后续数据分片,用来传输较长的数据。
    如果是 Frag 帧,则告知当前 content 部分+后续 content 部分的总长度,位于 Data 域的前 2 字节(即最大支持 64K 的 content 数据)。
    0x10~0x80 保留  
  2. Sequence Control

    序列控制域。帧发送时,无论帧的类型是什么,序列 (Sequence) 都会自动加 1,用来防止重放攻击 (Replay Attack)。每次重现连接后,序列清零。

  3. Length

    Data 域的长度,不包含 CheckSum。

  4. Data

    不同的 Type 或 Subtype,Data 域的含义均不同。请参考上方表格。

  5. CheckSum

    此域为 2 byte 的校验,用来校验『序列 + 数据长度 + 明文数据』。

ESP32 端的安全实现

  1. 保证数据安全

    为了保证 Wi-Fi SSID 和密码的传输过程是安全的,需要使用对称加密算法(例如 AES、DES等)对报文进行加密。在使用对称加密算法之前,需要使用非对称加密算法(DH、RSA、ECC 等)协商出(或生成出)一个共享密钥。

  2. 保证数据完整性

    保证数据完整性,需要加入校验算法(例如 SHA1、MD5、CRC 等)。

  3. 身份安全(签名)

    某些算法如 RSA 可以保证身份安全。有些算法如 DH,本身不能保证身份安全,需要添加其他算法来签名。

  4. 防止重放攻击 (Replay Attack)

    加入帧发送序列(Sequence),并且序列参与数据校验。

    在 ESP32 端的代码中,你可以决定和开发密钥协商等安全处理的流程参考上述流程图)。手机应用向 ESP32 发送协商数据,将传送给应用层处理。如果应用层不处理,可使用 BluFi 提供的 DH 加密算法来磋商密钥。应用层需向 BluFi 注册以下几个与安全相关的函数:

typedef void (*esp_blufi_negotiate_data_handler_t)(uint8_t *data, int len, uint8_t **output_data, int *output_len, bool *need_free);

该函数用来接收协商期间的正常数据 (normal data),处理完成后,需要将待发送的数据使用 output_data 和 output_len 传出。

BluFi 会在调用完 negotiate_data_handler 后,发送 negotiate_data_handler 传出的 output_data。

这里的两个『*』,因为需要发出去的数据长度未知,所以需要函数自行分配 (malloc) 或者指向全局变量,通过 need_free 通知是否需要释放内存。

typedef int (* esp_blufi_encrypt_func_t)(uint8_t iv8, uint8_t *crypt_data, int cyprt_len);

加密和解密的数据长度必须一致。其中 iv8 为帧的 8 bit 序列 (sequence),可作为 iv 的某 8 bit 来使用。

typedef int (* esp_blufi_decrypt_func_t)(uint8_t iv8, uint8_t *crypt_data, int crypt_len);

加密和解密的数据长度必须一致。其中 iv8 为帧的 8 bit 序列 (sequence),可作为 iv 的某 8 bit 来使用。

typedef uint16_t (*esp_blufi_checksum_func_t)(uint8_t iv8, uint8_t *data, int len);

该函数用来计算 CheckSum,返回值为 CheckSum 的值。BluFi 会使用该函数返回值与包末尾的 CheckSum 做比较。

GATT 相关说明

UUID

BluFi Service UUID: 0xFFFF,16 bit

BluFi (手机 -> ESP32) 特性:0xFF01,主要权限:可写

BluFi (ESP32 -> 手机) 特性:0xFF02,主要权限:可读可通知

ESP32之蓝牙配网blufi相关推荐

  1. 乐鑫Esp32学习之旅 19 重磅开源,如何在微信小程序上ble蓝牙配网esp32,blufi的那些事!

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  2. 开源一个微信小程序,支持蓝牙配网+WiFi双控制ESP32-C3应用示范;(附带Demo)

    文章目录 一.前言 二. Blufi乐鑫自研的蓝牙配网协议 ESP32 配网流程 流程图 三.相关代码 3.1 蓝牙快速配网 3.2 蓝牙本地控制 2.3 外设驱动 3.1 蓝牙搜索 3.2 蓝牙服务 ...

  3. 【微信小程序控制硬件15 】 重认识无线物联网的配网协议,了解腾讯物联蓝牙协议LLSync SDK,腾讯连连小程序也可以蓝牙配网了。

    文章目录 一.配网的认识 1.1 各类Wi-Fi配网方式对比 1.2 设备热点配网 1.3 零配配网 1.4 蓝牙辅助配网 1.5 一键配网 1.6 手机热点配网 1.6 摄像头扫码配网 二.LLSy ...

  4. ESP32开发--一键配网与Airkiss配网

    ESP32基础系列 ESP32初体验之环境搭建 ESP32外设学习之GPIO ESP32外设学习之UART ESP32开发之给模块连上网络 ESP32的一键配网与Airkiss配网 ESP32使用NV ...

  5. 【MicroPython ESP32】手动配网和wifi信息保存示例

    [MicroPython ESP32]手动配网和wifi信息保存示例 本示例基于Thonny平台开发. 入网演示 配网机制 ESP32 Micropython运行后,首先从目录下读取json配置文件信 ...

  6. 智能硬件蓝牙配网方案概要

    智能硬件开发系列 Google Protobuf 实践使用开发 智能硬件蓝牙配网方案概要 JNI开发必学C++基础 JNI开发必学C++使用实践 Android Studio 4.0.+NDK项目开发 ...

  7. WIFI配网方案:1、蓝牙配网 2、WIFI自身配网 3、SmartConfig一键配网

    蓝牙配网: 顾名思义,通过蓝牙给WIFI配网,过程相对较为简单,首先设备上具有WIFI和蓝牙两种功能.然后通过手机的小程序或者APP连接产品蓝牙,连接之后发送WIFI连接所需要的SSID和PASSID ...

  8. 微信小程序-蓝牙配网功能

    蓝牙配网-连接设备 注:这两天接手了一个设备运维端小程序,需要在上面加一个新功能,蓝牙配网,就是通过扫描设备二维码,拿到该设备的uuid.设备名等信息,然后通过蓝牙连接上该设备并往设备中写入数据.读取 ...

  9. 【微信小程序控制硬件16 】 安信可 ESP32-S 开发板实现移植腾讯物联开发平台蓝牙 llsync 协议,实现一键蓝牙快速配网+远程控制。(附带源码)

    文章目录 一.前言 二.源码目录说明 三.编译指导 四.常见问题 五.开源微信物联网控制一览表 另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈! 微信物联 ...

最新文章

  1. ege函数库_EGE图形库|EGE图形库下载v12.11 最新版 附使用教程 - 欧普软件下载
  2. python3 文件 复制、重命名、移动、删除
  3. php html自动打开新页面大小,HTML_html 用超链接打开新窗口其可控制窗口属性,1、html超链接打开的窗口大小 - phpStudy...
  4. java下载pdf6_疯狂java讲义第6版 电子版(pdf格式)
  5. php orm 链式,关于php:雄辩的ORM中的交叉和分页
  6. win7 vs2015配置qt5.11
  7. python小括号( )与中括号 [ ]
  8. 【零基础学Java】—递归(五十一)
  9. python利器-python利器去广告版
  10. ALSA driver --PCM 实例创建过程
  11. 一、操作系统的基本概念
  12. VHDL——4选1数据选择器
  13. SQL注入——判断注入
  14. 51单片机步进电机c语言程序,51单片机的步进电机c语言驱动程序
  15. android强制开启深色模式bug,强制深色模式软件
  16. hadoop is not in the sudoers file. This incident will be reported.问题解决
  17. zbrush 制作护腕1 -- 基础模型
  18. 支付10秒倒计时链接页面跳转
  19. 网络编程和数据库(一)
  20. atof跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换

热门文章

  1. 计算机教学考核方案,计算机基础实训课教学计划及考核方案.doc
  2. 多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程
  3. MYSQL:changer buffer 和 redo log
  4. 谁是古代最风流的首席娱乐官?
  5. 关于手写笔记、电子笔记、摘录的思考
  6. 2021澳洲wace高考成绩查询,官宣!2019澳洲WACE高考日程表发布!
  7. Redis(十九),老男孩linux视频
  8. 阿里云服务器使用配置
  9. Excel中的宏--VBA的简单例子
  10. 笔记:3.5 《数据库系统概论》之基本表更新(INSERT、UPDATE、ALTER、DELETE)与视图VIEW(定义、查询、更新)