一、 概述
蓝牙键盘是 HID ( Human Interface Device ) 设备的一种,即人机交互设备,开发需遵循 HOGP (HID Over GATT Profile) 规范,HOGP 规范改编于 USB HID Protocol,本文将基于 NXP QN9080 IC 介绍如何使用 HOGP 规范开发蓝牙键盘
二、 环境搭建
2.2 硬件
本文基于 QN9080 DK 板进行开发,DK 板如图 2.2 所示
图 2.2
2.3 开发软件
SDK 支持 IAR、Keil、MCUXpreeso IDE 三种开发软件、本文以 IAR 为开发环境作为介绍
三、 工程移植
在 SDK_2.2.0_QN908XCDK\boards\qn908xcdk\wireless_examples\bluetooth\hid_device 目录下的工程已经实现蓝牙鼠标的功能,我们可参考此工程实现蓝牙键盘
蓝牙应用由多个 Profile 组成,Profile 由 Service 和 Characteristic 组成,所以我们需要修改 Service 及 Characteristic 来完成键盘的开发
在工程 gatt_db.h 文件可以看到已经创建好了GATT、GAP、Battery、Device Information、HID Service 的 Service 和 Characteristic,其中 GATT 及 Battery 与 Mouse 工程相同,无须修改,其它修改步骤如下:
3.1 GAP 修改
GAP,Generic Access Profile,即通用访问配置文件,在 GAP Service 中定义了设备的类型及命名,我们需要将设备 Mouse 修改为 Keyboard,如图 3.1 所示
图 3.1
3.2 Device Information 修改
Device Information 中描述了 HID 设备的一些信息,我们只需将 Mouse 的信息修改为 Keyboard,其它内容介绍可通过蓝牙 HOGP 规范了解,修改如图 3.2 所示
图 3.2
3.3 HID Service 修改
HID Service 是定义了人机接口的服务,UUID 是 0x1812,其应用包括鼠标、键盘、手柄等,我们需要将鼠标修改为键盘,可通过修改 Report Map Characteristic、Report Characteristic、Boot Report Characteristic 来实现
3.3.1 Report Map 修改
标准的鼠标数据包括 X,Y 坐标、左右键值及滚轮键值,而键盘数据为 0-9,A-Z 及一些功能键,控制键,我们需要将鼠标 Report Map 修改成键盘的 Report Map,参考 HID 协议,键盘 Report Map 如图 3.3.1.1 所示
图 3.3.1.1
Report Map 共定义了三个 Input 共 8 Byte,二个 Output 共 8 Byte
- Report Map 定义 8 Byte 的 Input Report,具体数据格式如下
Byte 0:特殊键
Byte 1:保留常量
Byte 2-7:普通按键
- Report Map定义 8 Bit 的 Output Report,具体数据格式如下
Bit 0:Num Lock
Bit 1:Cap Lock
Bit 2:Scroll Lock
Bit 3-7:Constant
在 gatt_db.h 文件中将 Mouse Report Map 修改为 Keyboard Report Map,如图 3.3.1.2 所示
图 3.3.1.2
3.3.2 Report Characteristic 修改
在 gatt_db.h 文件中将 Mouse 数据量改为 Keyboard 数据量,由 Keyboard Report Map 可知 Input Report 为 8 Byte,将数据量改为 8,如图 3.3.2 所示
图 3.3.2
3.3.3 Boot Report Characteristic 修改
在 gatt_db.h 文件中将 Mouse 数据量改为 Keyboard 数据量,由 Keyboard Report Map 可知 Input Report 为 8 Byte,将 Boot Report Characteristic UUID 修改为 Keyboard UUID 0x2A22,由 HOGP 规范可知键盘 Boot Report Characteristic UUID 为 0x2A22,修改如图 3.3.3 所示
图 3.3.3
3.4 修改发送格式
在蓝牙鼠标例程中,通过 400ms Timer 定时发送鼠标数据,我们需要在 hid_device.c 中将鼠标数据改为键盘数据,由 Report Map 可知,Input Report 为 8 Byte ,格式修改后如图 3.4.1 所示:
图 3.4.1
实验测试使用 400ms Timer 一直发送字母 a,a 按下的 Keycode 为 0x04,松开 keycode 为0x00,在 hid_device.c 修改发送函数,具体修改如图 3.4.2 所示
图 3.4.2
3.5 测试结果
上电按 SW1 进行广播,与电脑连接后输入密钥 999999,连接成功后就可看到在电脑上一直输入 a 字母,如图 3.5 所示
图 3.5
四、 总结
本文实现了一个简单的键盘,实际键盘产品开发还有很多功能需要完成,如低功耗、OTA 升级、以及安卓,MAC ,Windows 各版本系统兼容性问题,更多资料可关注大联大世平编写的《基于 NXP QN9080 低功耗移植》、《基于 NXP QN9080 蓝牙 OTA 移植》等文档介绍