蓝牙hid
写在前面:使用SDK版本 NRF 12.3.0,
nRF52\nRF52832 pack\nRF5_SDK_12.3.0_d7731ad\examples\ble_peripheral\ble_APP_hids_mouse,本文仅对代码分析,如有理解不到位的地方,欢迎沟通,QQ:993650814.
正文:
一、 HID准备资料:
1、BLE HID简介
2、BLE HID控制手机相机或音乐
3、HID 报告描述 2
首先感谢这位兄弟的分享,引用这三篇文章,如有不妥请及时联系我后立马删除。
二、
1、添加HID 服务:
在 services_init() 函数中,有个 hids_init()函数,这个函数开始定义了一个静态数组rep_map_data,
这个数组中内容具体含义的理解,参考上面的连接HID 报告描述 2。刚开始学习HID协议者,也可以暂时忽略这里。
这个数组中的数据实际上是3个报告描述符,这3个报告描述符分别描述了:
(1)、鼠标按键和滚轮数据是如何组织的。
(2)、鼠标移动数据是如何组织的。
(3)、描述了一个高级按键用来播放音乐等功能。
在 ble_hids_init 函数中,
在 上面链接BLE HID简介中有讲到,HID服务的UUID是0x1812, 而 BLE_UUID_HUMAN_INTERFACE_DEVICE_SERVICE 这个宏就是这个值,
2、添加 Protocol Mode Characteristic ,
BLE HID简介中也有讲到,这个Characteristic 用来指示当前服务是boot Protocol 还是 report Protocol,UUID为0x2A4E,其特性值为0x00表示boot Protocol ,特征值为0x01表示report Protocol,这两种 Protocol的解释连接里面都有。看一下代码中的配置:
在hids_init函数中,
所以也会进入到 protocol_mode_char_add 函数中,
来看一下这几个宏定义,
BLE_UUID_PROTOCOL_MODE_CHAR
DEFAULT_PROTOCOL_MODE
所以选择的是report protocol 模式。
3、添加 Report Characteristic:
这个characteristic用来传输input report、output report、还是feature report的,UUID为0x2A4D,因为本利是蓝牙鼠标,所以只用来传输 input report,上面提到了,一共3个报告,所以3个报告都必须要具有notify通知功能,即device 通知 host。看代码:
来看一下 p_hids_init->inp_rep_count 值的赋值和p_hids_init->p_inp_rep_array[i]报告描述符的指针指向,都在hids_init函数中,
进入到 rep_char_add 函数中来,
看一下上面提到的 BLE_UUID_REPORT_CHAR是不是0x2A4D,
3、添加Report Reference Characteristic
一个HID 服务下面有多个Report Characteristic,UUID均为0x2A4D,为了区分每个Report Characteristic用来传输什么类型的report,每个Report Characteristic 都有一个相关描述符,就叫做Report Reference Characteristic,UUID为0x2908。这个描述符的值有两个字节,report ID 和report TYPE,如下:
接着 rep_char_add 函数 继续往后看,
看一下这个BLE_UUID_REPORT_REF_DESCR 定义:
ble_srv_report_ref_encode 这个函数中,对encoded_rep_ref做了初始化,
还是回到 hids_init 函数中,
而且类型都是Input如下:
也就是都传输的input report。
4、添加 Report Map Characteristic,
报告描述符是一系列有格式和规则的数据,其内容就是描述report protocol 模式下传输的report的数据的格式和作用。这些报告描述符就在 Report Map Characteristic 中,UUID:0x2A4B。看下代码:
rep_map_char_add 函数中,
BLE_UUID_REPORT_MAP_CHAR 这个值定义:
看一下 Report Map Characteristic 的值是谁,同样在 hids_init 函数中,
而 rep_map_data就是一开始提到的3个报告的报告描述符数组。
rep_map_char_add() 函数后面还添加了 Report Reference Characteristic 就不一一分析了。
5、 后面还有两个 HID Information characteristic和HID Control Point characteristic分别是用来放一些版本信息和指示HOST状态的,就不一一分析了。
三、Device 通过Ble 向Host 数据透传
至此,HID服务以及所有的characteristic和descriptior 已经添加完毕。
接下来,应该是鼠标移动然后将数据传到Host端了。
因为开发板中没有鼠标,就用按键模拟鼠标,通过每按下一次按键来代表鼠标移动多少距离。
1、bsp_event_handler 函数中,四个按键均代表不同的鼠标行为:
2、 再来看一下 mouse_movement_send函数中数据是怎么透传的,
INPUT_REP_MOVEMENT_LEN 的定义:
这里,为什么传输数据的长度是3? 还得看hids_init 函数中定义的这个rep_map_data报告描述符中定义的第二个报告,鼠标的数据是如何组织的如下:
INPUT_REP_MOVEMENT_INDEX的定义如下:
3、最终调用 ble_hids_inp_rep_send 函数将数据透传出去,
最后,还是调用了协议栈函数 sd_ble_gatts_hvx 将鼠标移动的坐标信息发给了HOST。
如果有帮助到你,是否考虑给我一点鼓励呢,我会写出更有质量的文章。多谢。
相关阅读
hidefocus即隐藏聚焦,具有使对象聚焦失效的功能,其功能相当于: onFocus="this.blur()" 它的值是一个布尔值,如 hidefocus="true"。
Cable Modem的一些参数321物理层 下行通道的频率范围为88~860MHz,每个通道的带宽为6MHz(NTSC 6 G-MHz,PAL 8MHz),采用64QAM或2
真无线蓝牙耳机,简称TWS耳机,正在以一发不可收拾之势席卷到整个数码终端市场。作为首批开始使用TWS耳机吃螃蟹的,小编到现在一共体验
索尼h.ear系列WH-H900N蓝牙降噪耳机 给用户带来Hi-Res
索尼h.ear系列WH-H900N蓝牙降噪耳机在听音乐时富有表现力,氛围渲染能力较强,用官方描述就是“沉浸式聆听”。支持LDAC,和
函数原型:BOOL EnableWindow(HWND hWnd, // handle to window (i)BOOL bEnable // flag for enabling or disab