BLE 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。

  • 11
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值