分类: 嵌入式
2018-03-19 14:28:53
以SDK下自带的 HID 鼠标示例为例说明:
代码中 main中调用了services_init初始化几个服务。
其中调用hids_init 来初始化hid服务
函数中首先定义了 static uint8_t rep_map_data[] 这个数组变量。
这个变量里面存的值就是 报告描述符,其将会被设置为Report Map Characteristic的值。这样和手机连接后,手机就会读取这个特性值,从而知道 ble device可能发过来的几种数据以及其各个数据的含义。
该 鼠标示例中 报告描述符 描述了3种报告,
报告1,描述鼠标 按键和滚轮数据如何组织的。
报告2,描述鼠标 的移动数据是如何组织的。
报告3, 描述了一个高级按键,其功能是控制音乐的播放等。
例子中已经实现的是通过按键来 返回鼠标的移动,所以烧写程序后连接上手机,通过按键可以看到手机屏幕上出现鼠标的移动。
这里主要介绍 报告描述符中的 报告3 部分,一般使用ble HID也是用来控制音乐播放的。
报告描述符中的报告3截图如下。
定义了report size为1 即1 bit, report count为1。即1个1bit,
因为 report size,和report count为global项目,所以会应用到下面的8个usage中,
也就是下面的8个usage都是1bit,8个即凑成了1个字节。每个位表示一个功能,所以实际传送1字节,通过设置其中的位就能实现不同的控制了。
8个位的功能,已有注释,
其中一键启动应用,这个没搞清,应该是要手机端也设置吧。
应用控制也没搞清什么用,
返回键 和手机上的返回键功能一样。
之后程序调用ble_hids_init 开始创建 HID 服务。
包括一个 Add Protocol Mode characteristic. 其特性值就是上面说的报告描述符。
3个report characteristic,用来传输input report,即ble device发送给手机的按上述报告描述符组织的报告数据,每个report characteristic下都有其Report Reference descriptor,该描述符描述了 该report 会设置为Input report,并且有其字节的report id。
这样3个 input report便更根据其report id通过3个特性值来传送
PS:参见 BLE-HID简介的描述。
该例子中没有 output report,所以不需要创建对应的 report characteristic.
其他的描述符参见代码中的注释以及 BLE-HID简介中的文档描述。
现在修改 该例子来实现音乐的控制。根据上面的描述我们知道就是要根据报告描述符中的 报告3所描述的数据组织来发送数据。
所发送的数据只有1字节,每个位分别表示一个功能。
并且需要通过 report id为3的那个 characteristic来发送。
在main.c中添加如下代码来发送音乐控制信号。
点击(此处)折叠或打开
然后搜索 main.c中的bsp_event_handler 函数,该函数中对几个按键的处理是发送 鼠标位移,将其改成发送音乐控制信息。
PS:我的板子是兼容官方板PCA10028的所以有4个按键,按键已经在main函数中的buttons_leds_init中默认初始化了,每个按键按下会产生默认事件。
在main.c文件的bsp_event_handler()函数为按键处理函数
修改按键的处理函数如下
编译后烧写固件连接手机后就可以按键测试了,连接最好通过 手机设置中的蓝牙来连接而不是 ble的app软件。HID服务需要配对绑定,有的app连接后不配对导致连接不成功。
另外,工程默认使用了绑定和白名单的,所以如果连接了一个手机后再重启开发板,开发板就是使用之前连接过的手机执行白名单过滤,导致其他手机搜不到该设备了。所以可以直接修改代码让其每次启动时删除绑定信息。
相机控制比较简单,手机系统自带的相机一般都支持 音量键的 +/- 时会自动拍照。所以实现 控制相机的拍照跟 ble-hid音乐控制一样。 只要修改一下按键的时候发送 音量+或者音量-的控制信号就可以了。
报告描述符不需要修改,依旧使用sdk中设置的。 报告id为3的报告就可以用来控制相机,只要发送音量+或-就行了
需要修改的只是按键的时候发送 音量控制就可以控制相机拍照了。
根据报告描述符中的 报告3所描述的数据组织来发送数据。
所发送的数据只有1字节,每个位分别表示一个功能。
并且需要通过 report id为3的那个 characteristic来发送。
在main.c中添加如下代码来发送 控制信号。
同音乐控制,这里只要修改一下按键发送音量控制就可以了
编译后烧写固件通过手机系统蓝牙连接设备后, 打开系统相机 就可以按键测试了,