ESP32S3 BLE_HID的编程实现
BLE是低功耗蓝牙,HID是Human Interface Device,也就是人机接口设备。
主要用于无线连接并传输用户输入数据(如按键、触控、手势等)。
核心概念
- BLE(Bluetooth Low Energy)
- 蓝牙4.0及以上版本引入的技术,专为低功耗设计,适合电池供电设备(如键盘、鼠标)。
- 传输数据量小、连接速度快,功耗仅为传统蓝牙的1/10~1/100。
- HID(Human Interface Device)
- 源自USB HID标准,定义了键盘、鼠标、游戏手柄等设备的通用通信协议。
- BLE HID将这一协议无线化,无需物理线缆即可实现设备交互。
与传统蓝牙HID的区别
特性 | 传统蓝牙HID | BLE HID |
---|---|---|
功耗 | 较高 | 极低 |
连接速度 | 较慢 | 快(毫秒级) |
兼容性 | 依赖传统HID协议 | 基于GATT,更现代 |
适用设备 | 需较高数据速率(如音频) | 低频输入设备(按键、点击) |
协议实现
- HID Service
通过GATT(通用属性协议)定义服务,包含以下关键特性:- Report Map:描述设备功能(如按键映射)。
- Input/Output Report:传输实际输入/输出数据。
- Protocol Mode:切换Boot Protocol(兼容BIOS)或Report Protocol(标准模式)。
代码源自esp-idf例程ble_hidd_demo
执行流程
1![]() |
初始化NVS:(Non-Volatile Storage,非易失性存储)是 ESP-IDF 提供的一种存储机制,用于在设备的闪存中保存数据,即使设备断电后数据也不会丢失。nvs 通常用于存储配置信息、蓝牙配对信息等。释放经典蓝牙模式的内存 |
---|---|
2![]() |
初始化BLE控制器->启用蓝牙控制器,设置为BLE模式->初始化Bluedroid协议栈->启用Bluedroid协议栈->初始化HID(Human Interface Device)配置文件 |
3![]() |
注册回调函数到GAP(Generic Access Profile)模块->注册回调函数到GAP(Generic Access Profile)模块-> 注册回调函数到HID模块->设置BLE安全参数->创建HID任务(用户或自动执行) |
4![]() |
BLE广播(等待设备连接esp32s3的低功耗蓝牙)->设备连接BLE->触发连接事件 ->开始配对BLE |
5![]() |
设备成功配对BLE ->设置连接成功标志位 ->进入人机交互任务 |
6![]() |
HID任务循环 ->判断连接状态 -> 发送指令(操作)+数据 |
配置项目
ble_hidd_demo_main.c:此文件是演示如何使用 HID 的示例(您可以使用它连接到智能手机作为消费者设备,然后使用按钮来增加或减少音量等,或者连接到 Windows 10 PC 作为键盘或鼠标)
hidd_le_prf_int.h:此头文件包含一些与 HID 配置文件相关的定义。
esp_hidd_prf_api.h & esp_hidd_prf_api.c:这些文件包含 HID 配置文件的 API
当您使用 HID 配置文件时,只需添加 esp_hidd_prf_api.h 包含文件,并使用 esp_hidd_prf_api.c 文件中定义的函数发送 HID 数据。
hid_dev.h & hid_dev.c:这些文件定义了 HID 规范相关的定义
hid_device_le_prf.c:此文件是 HID 配置文件的定义文件,它包含 HID 配置文件的主要功能。它主要包含如何创建 HID 服务。如果您发送和接收 HID 数据并将数据转换为键盘键、鼠标和消费者值,则将其转发到应用程序。
整体执行流程
蓝牙初始化:
在主函数中,会初始化蓝牙堆栈并注册 GAP 事件回调函数。
事件处理:
当蓝牙事件发生时,回调函数会根据事件类型执行相应的逻辑。
HID 功能演示:
hid_demo_task 任务会在系统初始化完成后运行,可能会模拟键盘、鼠标或其他 HID 设备的行为。