查看: 1136|回复: 0

[资料发布] ESP32蓝牙配网

[复制链接]

21

主题

21

帖子

67

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
67
发表于 2023-1-14 10:38:00 | 显示全部楼层 |阅读模式
概览
BluFi 是一款基于蓝牙通道的 Wi-Fi 网络配置功能,适用于 ESP32。它通过安全协议将 Wi-Fi 的 SSID、密码等配置信息传输到 ESP32,然后 ESP32 可基于这些信息连接到 AP 或建立 SoftAP。

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

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

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

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

1.ESP32 开启 GATT Server 模式,发送带有特定 advertising 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、密码等 Wi-Fi 配置信息。

9.手机向 ESP32 发送 Wi-Fi 连接请求的控制帧。ESP32 收到这个控制帧之后,会认为手机已将必要的信息已经传输完毕,准备连接 Wi-Fi。

10.ESP32 连接到 Wi-Fi 后,发送 Wi-Fi 连接状态报告的控制帧到手机,以报告连接状态。至此配网结束。

备注

1.ESP32 收到安全模式配置的控制帧后,会根据定义的安全模式进行相关操作。

2.进行对称加密和解密时,加密和解密前后的数据长度必须一致,支持原地加密和解密。

BluFi 流程图




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

帧不分片情况下的格式 (8 位):



如果使能 帧控制 位,则 总长度 位表示帧的剩余部分的总长度,用于报告终端需要分配多少内存。
帧分片格式(8 位):


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

ACK 帧格式(8 bit):


1.类型字段

类型字段,占 1 字节。分为类型字段和子类型字段两部分,类型字段占低 2 位,子类型字段占高 6 位。

控制帧,暂不进行加密,可校验;

数据帧,可加密,可校验。

1.1 控制帧 (二进制:0x0 b’00)


1.2 数据帧 (二进制:0x1 b’01)


备注 1: 数据的长度取决于数据长度字段。当传输方向是 ESP 设备到手机时,表示向手机端提供所需信息。

备注 2: 数据的长度取决于数据长度字段。如果数据长度不够,该帧可用分片。

2.Frame Control

帧控制字段,占 1 字节,每个位表示不同含义。


3.序列控制

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

4.长度

数据字段的长度,不包含校验部分。

5.数据

对于不同的类型或子类型,数据字段的含义均不同。请参考上方表格。

6.校验

此字段占两个字节,用来校验“序列 + 数据长度 + 明文数据”。

ESP32 端的安全实现

1.数据安全

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

2.保证数据完整性

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

3.身份安全(签名)

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

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

添加其到序列字段中,并且在数据校验过程中使用。

在 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 crypt_len)
加密和解密的数据长度必须一致。其中 IV8 为帧的 8 位序列,可作为 IV 的某 8 个位来使用。

typedef int (* esp_blufi_decrypt_func_t)(uint8_t iv8, uint8_t *crypt_data, int crypt_len)
加密和解密的数据长度必须一致。其中 IV8 为帧的 8 位序列,可作为 IV 的某 8 个位来使用。

typedef uint16_t (*esp_blufi_checksum_func_t)(uint8_t iv8, uint8_t *data, int len)
该函数用来进行校验,返回值为校验的值。BluFi 会使用该函数返回值与帧的校验值进行比较。

GATT 相关说明
UUID
BluFi Service UUID: 0xFFFF,16 bit

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表