蓝牙MIDI BLE-GATT概念


关于本节

如果你了解蓝牙4.0规范,你也许试图想通过蓝牙发送MIDI,正在尝试将该设备发布为BLE MIDI控制器......
不过这个主题的讨论,互联网上没有很多信息,找不到nRF52的过多信息,好吧,这次我们来试图设计一个自定义GATT((Generic Attribute Profile)),以满足实现使用nRF52平台MIDI设备的产品,来看看其中的步骤:


nRF52芯片的国产开发板

GATT的概念


我们首先需要涵盖两个非常重要的概念:通用属性配置文件(GATT)和属性协议(ATT)。
GATT代表通用属性配置文件。要了解GATT是什么,我们首先需要了解GATT的基础框架:属性协议(ATT)。只有在两个BLE设备之间建立连接后,GATT才会发挥作用。

属性协议(ATT)

ATT定义服务器如何将其数据公开给客户端以及这些数据的结构。ATT中有两个角色:

服务器

这是暴露其控制数据的设备,并接受来自对等设备传入的通知和指示命令并发送响应。例如,当温度计设备暴露其周围环境的温度,测量单位,其电池电量,它将充当服务器。 当然数据还包含温度计读取和记录温度的时间间隔,它还可以在温度读数发生变化时通知客户端(稍后定义),而不是让客户端轮询数据等待更改发生。

客户端

这是与服务器连接的设备,目的是读取服务器暴露出来的数据及控制服务器的行为。它是发送命令和请求并接受传入通知和指示的设备。在前面的示例中,如果一个手机设备连接到温度计,并读取其温度值的话,那么这个移动设备在其中就扮演了客户端的角色。

服务器公开的数据结构为属性属性是服务器暴露出任何类型数据的通用术语,用于定义此数据的结构。例如,服务和特征(后面都描述)是属性的类型。属性由以下内容组成:

属性类型(通用唯一标识符或UUID)

这是一个16位数字(在蓝牙SIG采用的属性的情况下),或128位数字(在开发人员定义的自定义属性类型的情况下,有时也称作为特定于供应商的UUID s)。例如,SIG采用的温度测量值的U​​UID是0x2A1C. SIG采用的属性类型(UUID)共享除了16位特殊的128位基础UUID:00000000 -0000-1000-8000-00805F9B34FB. 已发布的16-位UUID值以粗体替换2个字节在基础UUID中。另一方面,自定义UUID可以是不使用SIG采用的基本UUID的任何128位数字。例如,开发人员可以为温度读数定义自己的属性类型(UUID):F5A1287E-227D-4C9E-AD2C-11D0FD6ED640。
使用SIG采用的UUID的一个好处是减小了数据包大小,因为它可以作为16位表示而不是完整的128位值传输。

属性句柄

这是服务器为其每个属性分配的16位值 - 可将其视为地址。客户端使用此值来引用特定属性,并且服务器保证该值在两个设备之间的连接生命周期内唯一标识属性。句柄范围是0x0001-0xFFFF,其中0x0000是保留值。

属性权限

权限确定是否可以读取写入属性,是否可以通知指示属性,以及每个操作需要哪些安全级别。这些权限不是通过属性协议(ATT)定义或发现的,而是在更高层(GATT层或应用层)定义的。
下图显示了属性的逻辑表示:

通用属性配置文件(GATT)协议

现在我们已经介绍了属性的概念,我们将经常讨论BLE中的三个重要概念:

  • [ ] 服务 (Services)
  • [ ] 特征 (Characteristics)
  • [ ] 配置文件 (Profiles)
    这些概念专门用于服务器暴露层次结构化的数据。服务和特征是用于特定目的的属性类型。特征是属性数据库中的最低级别属性。配置文件有点不同,不会在服务器上发现 -​​ 我们将在本章后面解释它们。

GATT定义了服务的格式及其特征,以及用于与这些属性对接的过程,例如服务发现,特征读取,特征写入,通知和指示。

GATT 扮演与属性协议(ATT)相同的角色。角色不是按设备设置的 - 而是根据事务确定的(例如请求⟷响应,指示⟷确认,通知)。

因此,从这个意义上讲,设备可以充当为客户端提供数据的服务器,同时充当客户端读取由其他服务器提供的数据(所有这些都在同一连接期间)。

服务和特征(Services and Characteristics)

服务

服务其实就是一个或多个属性(其中一些是特征)的分组。它旨在将满足服务器上特定功能的相关属性组合在一起。例如,SIG采用的电池服务包含一个称为电池电量的特性。

服务还包含有助于在服务中构建数据的其他属性(非特征)(例如服务声明,特征声明等)。
这是服务结构看起来的样子:


从图中,我们可以看到服务由以下组成的不同属性:

  • [ ] 一个或多个包括服务
  • [ ] 一个或多个特征
  • 特征的属性
  • 特征值
  • 零个或多个特征描述
    一个包含服务(An include service)允许服务引用其他服务,例如扩展包含的服务。有两种类型的服务:
  • [ ] 主服务:代表设备的主要功能。
  • [ ] 辅助服务:提供设备的辅助功能,并由设备上的至少一个其他主要服务引用(包括)(很少使用,这里不再讨论)。

特征

特征始终是一个服务的一部分,它代表了一个服务器想要暴露给客户端的一块信息/数据。例如,电池电量特征表示可以由客户端读取的设备中的电池的剩余电量水平。该特征包含了其他有助信息:

  • [ ] 属性:由多个位表示,用于定义如何使用特征值。比如包括:读取写入写入而无响应通知指示
  • [ ] 描述:用于包含有关特征值的相关信息。比如包括: 扩展属性用户描述,用于订阅通知和指示的字段,以及定义值的表示的字段,例如值的格式单位

理解这些概念很重要,作为开发人员,您可能需要与芯片组或移动操作系统SDK提供的API进行交互,这些API将抽象出许多这些概念。

例如,您可能有一个API,用于启用特定特征的通知(您不一定需要知道堆栈最终会将值0x0001写入服务器的客户端特征配置描述符(CCCD)特征上来启用通知)。

比较重要的是,虽然服务中包含的特性没有任何限制,但服务是旨在将设备中特定功能的相关特征组合在一起。

例如,即使技术上可行 - 创建一种称为湿度服务的服务也没有意义,该服务包括湿度特性和温度特性。相反,对于这两个不同功能(温度读数和湿度读数)中的每一个都有两个独立的服务更有意义。

值得一提的是,Bluetooth SIG采用了许多服务和特性来满足大量常见用例。对于这些采用的服务,存在规范文档以帮助开发人员实现它们,同时确保与此服务的一致性和互操作性。

声明:梨木乔の技术栈|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 蓝牙MIDI BLE-GATT概念


梨木乔の技术栈