blufi无加密配网收发报文流程
以下是一个完整的、不使用加密和校验的 BluFi 配网流程示例。为了让你看得更清晰我们假设场景如下设备 (Device)ESP32作为 GATT ServerSSID 为MyAP密码为12345678。手机 App作为 GATT Client。安全模式无加密、无校验这是调试阶段最简单的模式。序列号 (Sequence)从0x00开始每发一帧无论收发都自动加1。 核心帧格式 (无加密/无校验)这是本次报文拆解的基础格式字段 (Field)长度 (Bytes)本例值说明Type10x?低2位0是控制帧1是数据帧高6位是子类型Frame Control10x000x00代表无加密、无校验、无需ACK、不分片Sequence10x?序列号从0开始递增Data Length10x?Data字段的字节长度DataN0x...实际的有效载荷Checksum2(无)无校验时此字段不存在 完整交互流程与十六进制报文整个交互过程就像一问一答App 发送指令设备执行并回复。第1步BLE 连接与密钥协商这部分通常由 App 调用 BLE 标准接口完成不属于 BluFi 协议帧范畴。成功连接后App 发现 BluFi 服务 (UUID:0xFFFF) 和读写特征。App - Device发起 GATT 连接。Device - App连接成功。第2步密钥协商 (使用 DH 算法)安全起见App 会先发起密钥协商交换公钥数据。这里仅示意报文结构。App - Device10 00 00 04 12 34 56 78(假设协商数据为12 34 56 78)10:0001 0000→ 低2位01数据帧高6位000100子类型0x04(协商数据)。00: 帧控制无加密/校验/ACK。00: 序列号0。04: 数据长度4字节。12 34 56 78: 协商数据 (如 DH 公钥)。Device - App10 01 00 04 ab cd ef 01(设备回复自己的协商数据)10: 数据帧子类型协商数据。01: 帧控制无加密/校验/ACK。00: 序列号0。04: 数据长度。ab cd ef 01: 设备回复的协商数据 (如 DH 公钥)。第3步设置安全模式协商完密钥后App 告诉设备后续通信的安全策略。本例使用0x00(无校验、无加密)。App - Device01 00 01 01 0001:0000 0101→ 低2位01控制帧高6位000001子类型0x01(设置安全模式)。00: 帧控制无加密/校验/ACK。01: 序列号1。01: 数据长度1字节。00: 数据内容。高4位(控制帧安全模式)0低4位(数据帧安全模式)0。关键字节。第4步发送 Wi-Fi SSIDApp 发送目标 AP 的 SSIDMyAP(十六进制:4D 79 41 50)。App - Device09 00 02 04 4D 79 41 5009:0000 1001→ 低2位01数据帧高6位000010子类型0x02(发送STA的SSID)。00: 帧控制。02: 序列号2。04: 数据长度4字节。4D 79 41 50: 字符串MyAP的十六进制表示。第5步发送 Wi-Fi 密码App 发送密码12345678(十六进制:31 32 33 34 35 36 37 38)。App - Device0D 00 03 08 31 32 33 34 35 36 37 380D:0000 1101→ 低2位01数据帧高6位000011子类型0x03(发送STA的密码)。00: 帧控制。03: 序列号3。08: 数据长度8字节。31 32 33 34 35 36 37 38: 字符串12345678的十六进制。第6步请求连接 AP信息发送完毕App 命令设备去连接 Wi-Fi。App - Device03 00 04 0003:0000 0011→ 低2位00控制帧高6位000011子类型0x03(请求连接AP)。00: 帧控制。04: 序列号4。00: 数据长度0字节 (此控制帧无Data字段)。Device - App设备收到后内部开始连接 Wi-Fi 流程。第7步设备报告连接状态设备连接 Wi-Fi 成功或失败后会主动向 App 报告状态。Device - App3F 00 05 02 01 003F:0011 1111→ 低2位11数据帧高6位001111子类型0x0F(Wi-Fi连接状态报告)。00: 帧控制。05: 序列号5。02: 数据长度2字节。01: Opmode0x01 (STA模式)。00: 连接状态0x00 (连接成功)。至此配网完成。 补充说明ACK 机制如果某一帧的帧控制字段要求对方回复 ACK接收方必须回复一个 ACK 帧[citation:2]。ACK 帧的 Type 为0x00(控制帧-ACK)Data 字段为被确认帧的 Sequence 号。关于校验和本例为清晰起见所有帧的 Frame Control 都是0x00。在启用校验 (CRC16) 的情况下需要在所有字段末尾加上2字节的 CRC16 值且 Frame Control 字段的 bit1 必须置1。