概述
BLE HID协议规范是以USB HID协议规范为蓝本的,可以认为是USB HID的无线方式。那么作为人机交互设备(HID),我们常见产品有:蓝牙鼠标,蓝牙键盘,蓝牙游戏手柄,蓝牙自拍杆等。另外有一点就是,对于Android系统的手机,手机BLE会主动连接已配对的支持BLE HID服务协议的设备。那么淘宝上的那种通过手机系统蓝牙自动连接开车锁的装置,就是用的这个原理。
BLE HID协议内容
报告
蓝牙人机交互设备支持三种报告(Report):报告(Input),输出(Output), 特征(Feature)。
输入报告:
BLE HID 从机设备发数据给 BLE HID主机设备.
输出报告:
BLE HID 主机设备发数据给 BLE HID从机设备.
特征报告:双向数据通道
通道
分为控制(同步)通道Control Channel和中断(异步)通道Interrupt Channel
模型
分为启动协议模型和报告协议模型,默认一般都是使用报告协议
消息
消息的大小不能超过L2CAP蓝牙逻辑链路控制和适配协议的MTU
服务
BLE HID服务UUID为0x1812(标准规范),数据存放在报告中,通过下面的各个特征 characteristic 来收发 HID 的报告数据。
代码分析
以Telink 825x SDK为例
#define CHARACTERISTIC_UUID_HID_BOOT_KEY_INPUT 0x2A22 //!< HID Boot Keyboard Input Report
#define CHARACTERISTIC_UUID_HID_BOOT_KEY_OUTPUT 0x2A32 //!< HID Boot Keyboard Output Report
#define CHARACTERISTIC_UUID_HID_BOOT_MOUSE_INPUT 0x2A33 //!< HID Boot Mouse Input Report
#define CHARACTERISTIC_UUID_HID_INFORMATION 0x2A4A //!< HID Information
#define CHARACTERISTIC_UUID_HID_REPORT_MAP 0x2A4B //!< HID Report Map
#define CHARACTERISTIC_UUID_HID_CONTROL_POINT 0x2A4C //!< HID Control Point
#define CHARACTERISTIC_UUID_HID_REPORT 0x2A4D //!< HID Report
#define CHARACTERISTIC_UUID_HID_PROTOCOL_MODE 0x2A4E //!< HID Protocol Mode
Battery /
static const u16 my_batServiceUUID = SERVICE_UUID_BATTERY;
static const u16 my_batCharUUID = CHARACTERISTIC_UUID_BATTERY_LEVEL;
static u8 batteryValueInCCC[2];
static u8 my_batVal[1] = {
99 };
HID /
static const u16 my_hidServiceUUID = SERVICE_UUID_HUMAN_INTERFACE_DEVICE;
static const u16 hidServiceUUID = SERVICE_UUID_HUMAN_INTERFACE_DEVICE;
static const u16 hidProtocolModeUUID = CHARACTERISTIC_UUID_HID_PROTOCOL_MODE;
static const u16 hidReportUUID = CHARACTERISTIC_UUID_HID_REPORT;
static const u16 hidReportMapUUID = CHARACTERISTIC_UUID_HID_REPORT_MAP;
static const u16 hidbootKeyInReportUUID = CHARACTERISTIC_UUID_HID_BOOT_KEY_INPUT;
static const u16 hidbootKeyOutReportUUID = CHARACTERISTIC_UUID_HID_BOOT_KEY_OUTPUT;
static const u16 hidbootMouseInReportUUID = CHARACTERISTIC_UUID_HID_BOOT_MOUSE_INPUT;
static const u16 hidinformationUUID = CHARACTERISTIC_UUID_HID_INFORMATION;
static const u16 hidCtrlPointUUID = CHARACTERISTIC_UUID_HID_CONTROL_POINT;
static const u16 hidIncludeUUID = GATT_UUID_INCLUDE;
static const u8 protocolMode = DFLT_HID_PROTOCOL_MODE;
// Key in Report characteristic variables
static u8 reportKeyIn[8];
static u8 reportKeyInCCC[2];
// HID Report Reference characteristic descriptor, key input
static const u8 reportRefKeyIn[2] =
{
HID_REPORT_ID_KEYBOARD_INPUT, HID_REPORT_TYPE_INPUT };
// Key out Report characteristic variables
static u8 reportKeyOut[1];
static const u8 reportRefKeyOut[2] =
{
HID_REPORT_ID_KEYBOARD_INPUT, HID_REPORT_TYPE_OUTPUT };
// Consumer Control input Report
static u8 reportConsumerControlIn[2];
static u8 reportConsumerControlInCCC[2];
static const u8 reportRefConsumerControlIn[2] =
{
HID_REPORT_ID_CONSUME_CONTROL_INPUT, HID_REPORT_TYPE_INPUT };
// Boot Keyboard Input Report
static u8 bootKeyInReport;
static u8 bootKeyInReportCCC[2];
// Boot Keyboard Output Report
static u8 bootKeyOutReport;
// HID Information characteristic
static const u8 hidInformation[] =
{
U16_LO(0x0111), U16_HI(0x0111), // bcdHID (USB HID version)
0x00, // bCountryCode
0x01 // Flags
};
// HID Control Point characteristic
static u8 controlPoint;
// HID Report Map characteristic
// Keyboard report descriptor (using format for Boot interface descriptor)
static const u8 reportMap[] =
{
//keyboard report in
0x05, 0x01, // Usage Pg (Generic Desktop)
0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection: (Application)
0x85, HID_REPORT_ID_KEYBOARD_INPUT, // Report Id (keyboard)
//
0x05, 0x07, // Usage Pg (Key Codes)
0x19, 0xE0, // Usage Min (224) VK_CTRL:0xe0
0x29, 0xE7, // Usage Max (231) VK_RWIN:0xe7
0x15, 0x00