BLE 外设如何实现 USB 通讯

  • 概述

在上一篇的文章中,我们简单分析了如何在 BLE 设备中判断连接的主机系统是苹果系统还是 windows 系统,在本篇中,我们会来解释在 BLE 中实现 USB 外设功能与直接通过有线 USB 实现外设功能有啥区别。

  • 功能分析

我们可以在蓝牙官方网址看到在蓝牙联盟中有定于用于鼠标键盘等电脑外设所用到的 HID(Human Interface Device)Profile,如下图所示:

 

所以其实在 BLE 通讯中实现鼠标键盘的功能本质上跟有线鼠标键盘一样的,需要进行的 USB 通讯数据交换只是从有线 USB 搬到 BLE 的其中一个 Profile 中进行而已。现在我们来看一下如何将 USB 描述符,Report ID 等这些元素搬到 HID Profile 中。

在官方文档中,我们可以清晰的看到 USB-HID 的数据结构与 HID Service 的数据结构的对应关系,如下图所示:


 

可以清晰的看到,原本在 USB-HID 中的数据被分到 HID Profile 中不同的特征值(Characteristic)中,其中最重要的描述符数据放到 Report Map 特征值中进行传输,其他 USB-HID 中的 Get Report,Set Report,Date Output,Date Input 分别用 Report 特征值来进行,其中不同的功能的特征值的 UUID 蓝牙联盟也有相应的定义,如下图所示:


其中不同的 Report 特征值可以通过其支持的读写权限声明的不同分为 Input Report、Output Report、Feature Report 三种,如下图所示:

这三种类型的 Report 特征值与 USB-HID 中的 Get Report,Set Report,Date Output,Date Input 的对应关系如下图所示:


综上所述,实际上在 BLE 中实现 USB 外设功能是通过一个 HID Profile 包装好 USB-HID 中的数据交换,USB-HID里面不同的数据交换分别装到不同的特征值中分别进行通讯。

  • 代码实现过程。

在通过对蓝牙联盟官方文档的研读后,我们可以清晰地知道 USB-HID 与 HID Service 中的数据对应关系之后,我们就通过 QN9080 SDK 中的 HID 例程来进行代码的分析。
其中上一章节中所说到的 Profile 及其特征值定义是放在例程中的gatt_db.h 文件中,如下图所示:


在里面我们找到 HID Profile 的定义:


其中我们可以看到,一开始会定义现在的 protocol mode 为 0x01,即 report protocol mode;下一个特征值就是关于 USB 设备的描述符数据;下面几个特征值就是根据描述符定义的 Report ID 所对应添加定义的特征值,注意一个 Report 就要对应一个特征值。将该例程编译烧录到开发板之后,电脑连接之后鼠标就会进行画框的操作了。

虽然例程中已经有一个完整的 BLE Mouse 的例程可以使用了,这非常方便。但是在经过了以上的文档查阅后,我们能够知道 HID Profile 中各个特征值的定义含义以及 USB-HID 的对应关系,这个会对我们后续一直其他 USB 外设有很大的帮助。

  • 参考文档
    1. Human Interface device profile 1.1.1 — 2015, SIG
    2. HID Service Specification 1.0 — 2011, SIG
    3. 16-bit UUID Numbers Document — 2021, SIG

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论