android蓝牙hid 鼠标,BLE HID协议-----蓝牙鼠标代码流分析

f0f44e9d5bf95ee1c8e06bd42b296e6b.png

隐藏了蓝牙

写在前面: 使用SDK版本NRF 12.3.0,

nRF52 \ nRF52832包\ nRF5_SDK_12.3.0_d7731ad \ examples \ ble_peripheral \ ble_app_hids_mouse,本文仅用于代码分析,如果没有足够的理解,欢迎交流,QQ: 993650814.

身体:

1. HID准备信息:

1. BLE HID简介

2,BLE HID控制手机或音乐

3,HID报告说明2

首先,感谢这个兄弟分享并引用了这三篇文章. 如果有任何问题,请及时与我联系并立即将其删除.

第二,

1. 添加HID服务:

在services_init()函数中,有一个hids_init()函数,该函数开始定义静态数组rep_map_data,

20180724102037387.png

为了解此数组中内容的具体含义,请参阅上面对连接HID报告2的描述. 那些刚开始学习HID协议的人现在也可以忽略它.

此数组中的数据实际上是3个报告描述符,分别描述:

(1)鼠标按钮和滚轮数据的组织方式.

(2)鼠标移动数据的组织方式.

70a78ef6cc1d4e24aa545decd21d7cb7.png

(3),描述了用于播放音乐和其他功能的高级按钮.

在ble_hids_init函数中,

20180724102345811.png

如上面链接中的BLE HID简介中所述,HID服务的UUID为0x1812,宏BLE_UUID_HUMAN_INTERFACE_DEVICE_SERVICE是此值,

20180724102546728.png

2,添加协议模式特征,

在BLE HID的简介中也提到了它. 此特征用于指示当前服务是引导协议还是报告协议. UUID为0x2A4E,对于启动协议,其特征值为0x00,对于0x01,其特征值为报告协议. 这两个协议的说明在链接中. 看一下代码中的配置:

20180724103526509.png

在hids_init函数中,

20180724103613789.png

因此,它还将进入protocol_mode_char_add函数,

20180724103919884.png

看看这些宏定义,

BLE_UUID_PROTOCOL_MODE_CHAR

20180724103950188.png

DEFAULT_PROTOCOL_MODE

20180724104039696.png

26499edc11c2ea4f111351016e3cf747.png

所以我选择了报告协议模式.

3. 添加报告特征:

此特征用于传输输入报告,输出报告或功能报告. UUID为0x2A4D. 因为利润是蓝牙鼠标,所以它仅用于传输输入报告. 如上所述,总共有3个报告,因此3个所有报告必须具有通知通知功能,即设备通知主机. 看一下代码:

20180724105405500.png

在hids_init函数中,查看p_hids_init-> inp_rep_count的值分配和p_hids_init-> p_inp_rep_array [i]报告描述符指针,

20180724105608196.png

20180724105627971.png

输入rep_char_add函数

20180724110056621.png

看看上面提到的BLE_UUID_REPORT_CHAR是否为0x2A4D,

20180724110227428.png

3,添加报告参考特征

在一个HID服务下有多个报告特征,UUID为0x2A4D,为了区分每个报告特征用来传输哪种类型的报告,每个报告特征都有一个相关的描述符,称为报告参考特征,UUID为0x2908. 该描述符的值有两个字节,报告ID和报告TYPE,如下所示:

20180724111200796.png

在rep_char_add函数旁边,继续往回看,

20180724111408716.png

查看此BLE_UUID_REPORT_REF_DESCR定义:

89641ab22c517b5cee69d731f5bfadd4.png

20180724111458819.png

在ble_srv_report_ref_encode中,此函数初始化encode_rep_ref,

20180724111720841.png

返回hids_init函数,

20180724111904678.png

所有类型的输入如下:

20180724111947626.png

是传输的输入报告.

4. 添加报告地图特征

报告描述符是一系列具有格式和规则的数据,其内容用于描述以报告协议模式传输的报告数据的格式和功能. 这些报告描述符在报告映射特征UUID: 0x2A4B中. 看一下代码:

在rep_map_char_add函数中,

20180724112733796.png

BLE_UUID_REPORT_MAP_CHAR此值定义:

20180724112757522.png

在hids_init函数中,查看“报表映射特征”的值是谁

2018072411294132.png

rep_map_data是开头提到的3个报告的报告描述符数组.

ddb349d5b3d456c323ddd0c62690b16b.png

在rep_map_char_add()函数之后添加了“报表参考特征”,因此我不会一一分析它们.

5. HID信息特性和HID控制点特性有两种,分别用于存储一些版本信息并指示HOST状态,因此我将不一一分析它们.

3. 设备通过Ble透明地将数据传输到主机

到目前为止,已经添加了HID服务以及所有特征和描述符.

下一步,应移动鼠标并将数据发送到主机.

因为开发板上没有鼠标,所以按钮用于模拟鼠标,并且每按一次按钮就表示鼠标移动的距离.

1. 在bsp_event_handler函数中,四个按钮都代表不同的鼠标行为:

2018072415355728.png

2,让我们看一下mouse_movement_send函数中的数据是如何透明传输的,

20180724154908957.png

INPUT_REP_MOVEMENT_LEN的定义:

20180724154941869.png

在这里,为什么传输的数据的长度为3?它取决于在hids_init函数中定义的rep_map_data报告描述符中定义的第二个报告. 鼠标数据的组织方式如下:

20180724155207819.png

INPUT_REP_MOVEMENT_INDEX的定义如下:

2018072415544524.png

3. 最后,调用ble_hids_inp_rep_send函数透明地传输数据,

20180724155752128.png

最后,调用协议栈功能sd_ble_gatts_hvx来将鼠标移动的坐标信息发送到主机.

如果有帮助,您会考虑给我一些鼓励吗?我会写更多高质量的文章. 非常感谢.

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/bofangqi/article-308105-1.html