必威体育Betway必威体育官网
当前位置:首页 > IT技术

BLE HID 协议-----蓝牙鼠标 代码流程分析

时间:2019-06-06 04:41:02来源:IT技术作者:seo实验室小编阅读:158次「手机版」
 

蓝牙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小技巧

hidefocus即隐藏聚焦,具有使对象聚焦失效的功能,其功能相当于: onFocus="this.blur()" 它的值是一个布尔值,如 hidefocus="true"。

CableModem原理

Cable Modem的一些参数321物理层 下行通道的频率范围为88~860MHz,每个通道的带宽为6MHz(NTSC 6 G-MHz,PAL 8MHz),采用64QAM或2

十五款真无线蓝牙耳机体验报告,全面分析真无线技术优缺

真无线蓝牙耳机,简称TWS耳机,正在以一发不可收拾之势席卷到整个数码终端市场。作为首批开始使用TWS耳机吃螃蟹的,小编到现在一共体验

索尼h.ear系列WH-H900N蓝牙降噪耳机 给用户带来Hi-Res

索尼h.ear系列WH-H900N蓝牙降噪耳机在听音乐时富有表现力,氛围渲染能力较强,用官方描述就是“沉浸式聆听”。支持LDAC,和

EnableWindow()函数的应用

函数原型:BOOL EnableWindow(HWND hWnd,      // handle to window  (i)BOOL bEnable      // flag for enabling or disab

分享到:

栏目导航

推荐阅读

热门阅读