写在前面:使用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。

BLE HID 协议-----蓝牙鼠标 代码流程分析相关推荐

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

    隐藏了蓝牙 写在前面: 使用SDK版本NRF 12.3.0, nRF52 \ nRF52832包\ nRF5_SDK_12.3.0_d7731ad \ examples \ ble_periphera ...

  2. 【无线通信协议笔记】蓝牙篇:BLE HID协议

    概述 BLE HID协议规范是以USB HID协议规范为蓝本的,可以认为是USB HID的无线方式.那么作为人机交互设备(HID),我们常见产品有:蓝牙鼠标,蓝牙键盘,蓝牙游戏手柄,蓝牙自拍杆等.另外 ...

  3. netts之 CTWSocket代码流程分析(整体是客户端请求式的)

    netts之 CTWSocket代码流程分析(整体是客户端请求式的) 1.外部程序载入调用 netts.dll 2.外部程序调用 netts实现的Stock_Init_Nodialog,(Stock_ ...

  4. android加载efi分区,高通Android UEFI XBL 代码流程分析

    高通Android UEFI XBL 代码流程分析 背景 之前学习的lk阶段点亮LCD的流程算是比较经典,但是高通已经推出了很多种基于UEFI方案的启动架构. 所以需要对这块比较新的技术进行学习.在学 ...

  5. android uefi 编译报错,【Android SDM660开机流程】- UEFI XBL 代码流程分析

    [Android SDM660开机流程]- UEFI XBL 代码流程分析 一.UEFI XBL 1.1 boot_images代码目录 1.2 UEFI代码运行流程 1.3 SEC (安全验证) 1 ...

  6. NORDIC Thingy:52 蓝牙 BLE 服务 SoC 程序调用流程分析之八, 网盘分享 PPT

    NORDIC Thingy:52 蓝牙 BLE 服务 SoC 程序调用流程分析之八 网盘分享 PPT https://pan.baidu.com/s/1BuhqsBwQIz0Zlwzy7u7SQw

  7. 全志 android 编译,全志A20启动代码流程分析 ——Android

    现在的CPU都固化了内部 ROM,内部 ROM中有一般都有一段程序,一般有如下几个功能: 1,初始化,部分外设,如USB,SDCARD 2,初始化DDR(内存)和NandFlash 3,加载boot( ...

  8. 全志android 编译,全志A20启动代码流程分析 ——Android

    现在的CPU都固化了内部 ROM,内部 ROM中有一般都有一段程序,一般有如下几个功能: 1,初始化,部分外设,如USB,SDCARD 2,初始化DDR(内存)和NandFlash 3,加载boot( ...

  9. Slub代码流程分析

    Slub代码流程分析: slub的代码晦涩难懂,在看书或者相关资料时看似简单,再去对照代码分析时会发现被打回原形,就像数学老师推导公式和自己去推导公式一样.因此,需要静下来心来仔细研读,看完原理之后分 ...

  10. 【SemiDrive源码分析】【X9芯片启动流程】26 - R5 SafetyOS 之 LK_INIT_LEVEL_TARGET 阶段代码流程分析(TP Drvier、Audio Server初始化)

    [SemiDrive源码分析][X9芯片启动流程]26 - R5 SafetyOS 之 LK_INIT_LEVEL_TARGET 阶段代码流程分析(TP Drvier.Audio Server初始化) ...

最新文章

  1. 子组件调用父组件方法_vue父子组件通信以及非父子组件通信的方法
  2. linux下elasticsearch 安装、配置
  3. 生成下拉框的几种方法总结——数据来源:数据库
  4. java 线程安全问题_java线程安全问题原因及解决办法
  5. go编写命令行工具_编写者的命令行文档转换工具
  6. 计算机专业考研复试经验【最终版本】(来自一位上岸又退学的二战dog)
  7. 【python】入门oj
  8. 练习1000 scanf 用法
  9. 1200兆路由器网速_1200m路由器有必要吗 只要我们选择5GHz频段就可
  10. ffmpeg下载安装,以及springboot 整合视频点播学习
  11. 关于个人目标的一篇博客
  12. linux编译文件 no such,Linux中编译或安装程序时提示No such file or directory
  13. Restful是什么?
  14. Codeforces Round #695 (Div. 2)ABCD题解详析
  15. 心路历程:爬虫实战——从数据到产品
  16. url地址的图片路径
  17. os.system返回值大全
  18. WIN7 64位系统,安装office 2010
  19. 漏洞检测之POC的学习
  20. Linux父子进程全局变量与局部变量

热门文章

  1. Docker安装Tomcat7
  2. 施乐S2011设置IP地址,打印自检页方法
  3. linux如何安装yum
  4. JDE学习report和from总结
  5. PDMS二次开发应用案例——PipelineTool
  6. 网页实现二维码扫描和解析
  7. 商业计划书范文3000_项目融资商业计划书模板范文PPT
  8. 思科刀片服务器系统,思科 UCS B 系列刀片服务器
  9. EMC测试项目与整改案例
  10. web测试要点及基本方法