目录
一、总体架构设计
二、连接状态切换流程图
三、关键模块技术实现
1. HID 服务动态启用/禁用(设备端)
A. 初始化时加载 HID 服务或跳过
B. 断开系统层 HID 连接
2. GATT 服务:App 与设备通讯控制接口
3. OTA 升级切换(DFU 模式)
四、App 交互逻辑建议
五、注意事项
六、设备端建议架构
七、总结方案结构图

在智能挂锁中,BLE HID + GATT + OTA/DFU 协议切换设计是一种常见的 多协议复用方案,适用于低功耗智能设备,需要在 HID 输入、标准 BLE 服务通讯(如 GATT)与 OTA 固件升级之间灵活切换。
设计目标:一套 BLE HID + GATT + DFU 的三态工作机制,且通过 App 控制 HID 的启用与关闭,同时支持靠近自动连接、App 唤醒(只支持Android)、连接状态切换和固件升级。
以下是完整的设计解析、切换逻辑、系统实现建议。
一、总体架构设计
1.系统模块角色划分
| 模块 | 说明 |
| BLE HID Profile | 提供与手机/iOS/macOS 进行输入交互(如自动连接、模拟按键、触摸输入) |
| BLE GATT Profile | 提供挂锁专属数据通信通道(如身份验证、开锁命令、状态上报) |
| OTA/DFU 模块 | 提供 BLE 下固件升级能力(nRF OTA、ESP OTA、DFU Service) |
2.协议架构设计
| 模式 | 用途 | 蓝牙协议 | 特性 |
| 快速靠近连接 | 唤醒设备,自动连接 | BLE + HID Profile | iOS /Andriod可自动连接并显示连接状态(系统设置-手机蓝牙列表显示) |
| 应用通信 | App 打开并控制设备 | GATT 自定义服务 | 支持配网、开锁、状态上报 |
| OTA 升级 | 固件更新 | DFU OTA 专用服务 | 进入后需断开现有连接再重连 |
二、连接状态切换流程图
前提:在APP端设置HID开启/关闭.以下为已开启HID流程图
【1】靠近广播(启用HID)─────┐
↓(系统自动连接)
【2】系统层 BLE HID 连接
↓(打开App)
【3】App连接GATT】───→ GATT 握手(认证、控制)
↓(App设置关闭HID)
【4】关闭HID并断开】←──── 设备断开系统BLE HID连接
↓
仅保留App GATT通信
↓(App触发升级)
【5】重启并切DFU】────→ 进入OTA广播 → DFU连接 → 升级完成
↓
重启回广播状态。
三、关键模块技术实现
1. HID 服务动态启用/禁用(设备端)
支持 App 控制是否启用 BLE HID 服务
实现方式:
A. 初始化时加载 HID 服务或跳过
设备端维护一个非易失性标志位(如 Flash 标志):
bool isHIDEnabled = read_setting_from_flash();
if (isHIDEnabled) {
ble_add_hid_service(); // 注册 HID 服务
}
App 通过 GATT 写入 disable_hid 指令 → 保存标志 → 重启设备。
B. 断开系统层 HID 连接
外设调用 GAP 断开连接:
esp_ble_gap_disconnect(remote_bda);
这将在 iOS/Android 上断开 BLE HID 连接,但不影响 GATT。
2. GATT 服务:App 与设备通讯控制接口
定义如下 GATT Characteristic:
| Characteristic | 类型 | 用途 |
| auth_control | write | 认证/开锁指令 |
| hid_toggle | write | 打开/关闭 HID 标志(写入后重启) |
| dfu_request | write | 切换至 DFU 模式请求 |
3. OTA 升级切换(DFU 模式)
接收到 dfu_request 后,立即:
存储 DFU 标志到 Flash
调用断电/重启接口
启动时判断 DFU 标志,跳转到 OTA bootloader
ESP32 示例:
write_flag(DFU_MODE);
esp_restart(); // 重启
nRF 示例:
sd_power_gpregret_set(BOOTLOADER_DFU_START);
NVIC_SystemReset();
四、App 交互逻辑建议
| 场景 | App 操作 |
| 靠近自动连接(HID) | App 被唤醒(只有Android可以主动唤醒,iOS不支持) |
| App 打开后 | 主动扫描连接 GATT 服务 |
| 用户关闭 HID 功能 | 写入 GATT:disable_hid=true,设备断开 HID |
| 用户升级固件 | 写入 GATT:enter_dfu=true,设备重启 DFU 模式 |
五、注意事项
| 事项 | 说明 |
| 系统限制 | App 无法主动断开 BLE HID,需设备端主动断开 |
| 广播策略 | 启用 HID 时广播 HID UUID;进入 DFU 模式时改为 DFU UUID |
| 隐私性设计 | HID 开启可作为靠近识别,GATT 控制实际安全事务(如开锁) |
| 多手机互斥连接 | 可通过广播中绑定 App ID 或认证后 GATT 通信维持唯一连接 |
六、设备端建议架构
main.c
├── ble_init()
│ ├── check_hid_flag()
│ ├── add_hid_service() // 动态加载
│ ├── add_gatt_services()
├── gatt_event_handler()
│ ├── on_hid_toggle()
│ ├── on_dfu_request()
│ ├── on_auth()
├── dfu.c / bootloader.c
├── enter_dfu_mode()
├── reset_to_ota_bootloader()
七、总结方案结构图
┌─────靠近连接─────┐
│ [HID广播+配对] │
└────────┬────────┘
↓(打开 App)
[App连接GATT]
↓(切换)
┌────App关闭HID────┐
│ 写入hid_flag关闭 │
└────────┬─────────┘
↓(断开HID)
只保留GATT通信
↓
App请求DFU升级
↓
DFU模式广播
↓
OTA完成→重启
↓
GATT复位
扩展阅读:
| 蓝牙HID:无线人机交互的通用标准 | 蓝牙HID:无线人机交互的通用标准 |
| 蓝牙 HID:常见应用和创新应用 | 蓝牙 HID:常见应用和创新应用 |
| BLE HID 开发中的常见挑战和解决方案(键盘、鼠标、遥控器) | BLE HID 开发中的常见挑战和解决方案(键盘、鼠标、遥控器) |
| BLE HID 低功耗设计:功耗分析、影响因素与优化策略 | BLE HID 低功耗设计:功耗分析、影响因素与优化策略 |
| Apple 耳机 (AirPods) 如何利用 BLE HID 进行输入 | Apple 耳机 (AirPods) 如何利用 BLE HID 进行输入 |
| BLE + Classic 在睡眠耳机中的应用:模式策略与切换逻辑详解 | BLE + Classic 在睡眠耳机中的应用:模式策略与切换逻辑详解 |
| 双模蓝牙高效设计:BLE + Classic 在智能穿戴等设备中的实现 | 双模蓝牙高效设计:BLE + Classic 在智能穿戴等设备中的实现 |
| BLE HID 外设与手机App:深入解析连接与断开机制 | BLE HID 外设与手机App:深入解析连接与断开机制 |
| iOS 和Android 对BLE HID 开发的支持与限制:键盘、鼠标、遥控器等设备指南 | iOS 和Android 对BLE HID 开发的支持与限制:键盘、鼠标、遥控器等设备指南 |
| Android 自研App 主动断开蓝牙连接的限制与策略:BLE 和Classic 设备指南 | Android 自研App 主动断开蓝牙连接的限制与策略:BLE 和Classic 设备指南 |
| Android 系统签名权限:系统级应用的专属高权限机制 | Android 系统签名权限:系统级应用的专属高权限机制 |
| BLE HID 属性实现近距离蓝牙挂锁快速配对与自动解锁 | BLE HID 属性实现近距离蓝牙挂锁快速配对与自动解锁 |
| BLE 设备三态工作机制:HID 自动连接、GATT 通信与DFU 固件升级 | BLE 设备三态工作机制:HID 自动连接、GATT 通信与DFU 固件升级 |
| 从 App 跳转系统蓝牙设置页面:Android 与 iOS 平台实现差异及优化策略 | 从 App 跳转系统蓝牙设置页面:Android 与 iOS 平台实现差异及优化策略 |
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END



















暂无评论内容