隐藏了蓝牙
写在前面: 使用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,
为了解此数组中内容的具体含义,请参阅上面对连接HID报告2的描述. 那些刚开始学习HID协议的人现在也可以忽略它.
此数组中的数据实际上是3个报告描述符,分别描述:
(1)鼠标按钮和滚轮数据的组织方式.
(2)鼠标移动数据的组织方式.
(3),描述了用于播放音乐和其他功能的高级按钮.
在ble_hids_init函数中,
如上面链接中的BLE HID简介中所述,HID服务的UUID为0x1812,宏BLE_UUID_HUMAN_INTERFACE_DEVICE_SERVICE是此值,
2,添加协议模式特征,
在BLE HID的简介中也提到了它. 此特征用于指示当前服务是引导协议还是报告协议. UUID为0x2A4E,对于启动协议,其特征值为0x00,对于0x01,其特征值为报告协议. 这两个协议的说明在链接中. 看一下代码中的配置:
在hids_init函数中,
因此,它还将进入protocol_mode_char_add函数,
看看这些宏定义,
BLE_UUID_PROTOCOL_MODE_CHAR
DEFAULT_PROTOCOL_MODE
所以我选择了报告协议模式.
3. 添加报告特征:
此特征用于传输输入报告,输出报告或功能报告. UUID为0x2A4D. 因为利润是蓝牙鼠标,所以它仅用于传输输入报告. 如上所述,总共有3个报告,因此3个所有报告必须具有通知通知功能,即设备通知主机. 看一下代码:
在hids_init函数中,查看p_hids_init-> inp_rep_count的值分配和p_hids_init-> p_inp_rep_array [i]报告描述符指针,
输入rep_char_add函数
看看上面提到的BLE_UUID_REPORT_CHAR是否为0x2A4D,
3,添加报告参考特征
在一个HID服务下有多个报告特征,UUID为0x2A4D,为了区分每个报告特征用来传输哪种类型的报告,每个报告特征都有一个相关的描述符,称为报告参考特征,UUID为0x2908. 该描述符的值有两个字节,报告ID和报告TYPE,如下所示:
在rep_char_add函数旁边,继续往回看,
查看此BLE_UUID_REPORT_REF_DESCR定义:
在ble_srv_report_ref_encode中,此函数初始化encode_rep_ref,
返回hids_init函数,
所有类型的输入如下:
是传输的输入报告.
4. 添加报告地图特征
报告描述符是一系列具有格式和规则的数据,其内容用于描述以报告协议模式传输的报告数据的格式和功能. 这些报告描述符在报告映射特征UUID: 0x2A4B中. 看一下代码:
在rep_map_char_add函数中,
BLE_UUID_REPORT_MAP_CHAR此值定义:
在hids_init函数中,查看“报表映射特征”的值是谁
rep_map_data是开头提到的3个报告的报告描述符数组.
在rep_map_char_add()函数之后添加了“报表参考特征”,因此我不会一一分析它们.
5. HID信息特性和HID控制点特性有两种,分别用于存储一些版本信息并指示HOST状态,因此我将不一一分析它们.
3. 设备通过Ble透明地将数据传输到主机
到目前为止,已经添加了HID服务以及所有特征和描述符.
下一步,应移动鼠标并将数据发送到主机.
因为开发板上没有鼠标,所以按钮用于模拟鼠标,并且每按一次按钮就表示鼠标移动的距离.
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来将鼠标移动的坐标信息发送到主机.
如果有帮助,您会考虑给我一些鼓励吗?我会写更多高质量的文章. 非常感谢.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-308105-1.html