在上一节介绍了基于Advertiser与Scanner的发现,对于FiRa的蓝牙OOB中,设备分为主连接器(Connector Primary,CP)与辅助连接器(Connector Secondary,CS),本节介绍基于蓝牙GATT服务的发现实现。

8、蓝牙GATT服务发现

        基于蓝牙GATT的服务发现流程,以及FiRa设备的蓝牙应用层,该应用实现设备发现并建立蓝牙连接。

FiRa标准——蓝牙OOB规范(三)_GATT服务

8.1 辅助连接器(Connector Secondary,CS)

本节描述蓝牙GATT层实现CS的结构和方法。

8.1.1 CS的GATT server定义

在GATT服务器端实现CS的设备被要求公开一个GATT Primary Service,UUID : 0xFFF4。

以下GATT特征公开在CS GATT Primary Service。此服务中,每个特征仅允许存在一个实例。

FiRa标准——蓝牙OOB规范(三)_GATT服务_02

可以看到,对于CS端服务的几个Characteristic的UUID依次为:0x2A03、0x2A04、0x2A05。

在OOB实现数据交换,均通过通过“IN”和“OUT”控制点特征,需要遵守第9.1节中描述的数据交换协议。


8.1.2 实现CS的GATT Server的行为

GATT服务器简单等待来自客户端的发现。直到一个客户端使能“OUT”控制点特征的值通知方法(通过客户端特征配置描述符,CCCD),服务器端都应该忽略各种通过“IN”控制点特征写入方法发送的命令。

一旦在“OUT”控制点特征上启用句柄值通知方法,GATT服务器将执行FiRA连接器数据包和FiRa连接器消息的处理,具体如下:

  • 它对FiRa连接器数据包中接收到的具有给定SECID,通过“IN”控制点特性的分段FiRa连接器命令消息(FiRa Connector command Message)进行重组。
  • 它将FiRa连接器响应消息拆分为一个或多个FiRa连接器数据包,并通过“OUT”控制点特征将它们发送到适当的GATT客户端设备。
  • 注意每个SECID与单个GATT客户端仅有一个有效会话。这意味着一旦GATT服务器接收到给定SECID的有效FiRa连接器消息,在前一个会话适当中止之前(也就是,GATT客户端在蓝牙链路层上完全断开连接,或会话由FiRa连接器消息中的逻辑命令重置),不允许其他客户端将 FiRa 连接器消息发送到相同的SECID。
  • 它拒绝与任何无效SECID通信的尝试。
  • 它使用管理SECID来通知GATT客户端所有异步事件(例如删除/添加任何SECID到列表、更改任何SECID的状态等)。

8.1.3 实现CP的GATT Client的行为

GATT客户端负责整个服务发现流程。一旦FiRa设备通过发现阶段并建立蓝牙连接,应按照以下方式进行操作:

  1. client应执行GATT服务发现,如蓝牙核心规范中定义。client应使用UUID找到CS,忽略其他GATT对象。
  2. 如果找到CS,客户端应继续GATT特征发现,以找到CS GATT Primary Service。
  3. 一旦发现操作完成,所有强制GATT对象都在CS中找到,客户端读取FiRa连接器能力特征值并分析接收到的数据
  4. 如果它找到一个合适的SECID进行对话,客户端通过写入其CCCD特征描述符来启用“OUT”控制点特性上的值通知。
  5. 一旦“OUT”控制点启用了值通知,客户端开始根据FiRa规范中定义的数据传输协议,通过“OUT”和“IN”控制点特征交换数据。
  6. 当与给定SECID的通信完成时(客户端在更高层级中止会话),它可以返回步骤 4 并继续使用另一个SECID。
  7. 如果没有更多的SECID进行对话,客户端应在蓝牙链路层断开连接,并且返回到设备发现阶段。

        如果在此序列中发生任何不可恢复的错误(例如,CS GATT Primary Service结构无法识别,FiRa连接器能力无法正确解析等),GATT客户端应通过终止蓝牙链路层上的连接来断开与服务器的连接。然后它将返回到设备发现阶段。

        由Client端进行主导,CP端发现CS端的GATT Server,需要找到CS GATT原服务,同时读取FiRa连接器能力并分析数据,分析SECID列表,可以开始特征数据交换。

        特征数据交换:开始前,客户端需要写入OUT控制点特征的CCCD,使能通知。使能通知后,CP与CS之间可以正常的进行数据交换。通过IN控制点特征写入数据,Server通过OUT控制点特征返回数据。

8.2 主连接器

本节描述蓝牙GATT层实现CP(Connector Primary)的结构和方法。在CP端对应GATT Client。

8.2.1 GATT Server CP定义

GATT Primary Service UUID : 0xFFF3

FiRa标准——蓝牙OOB规范(三)_FiRa_03

8.2.2 实现CP的GATT Server的行为

GATT服务器只是等待来自客户端的发现。它还应等待至少一次来自客户端的FiRa连接器能力特征值的有效更新。直到更新完成,且客户端启用“OUT”控制点特性上的值通知方法句柄前(通过客户端特性配置描述符CCCD),服务器应忽略通过“IN”控制点特性写入方法发送的所有命令。

一旦对FiRa连接器能力特征值句柄的有效写入操作发生并且在“OUT”控制点特征上启用了值通知,GATT服务器将执行FiRa连接器数据包和FiRa连接器消息的处理,如下所示:

• 它将FiRa 连接器命令消息划分为一个或多个FiRa 连接器数据包,并通过“OUT”控制点特性将它们传输到适当的GATT 客户端设备。
• 它通过“IN”控制点特性对通过具有给定SECID的FiRa连接器数据包接收的分段FiRa连接器响应消息进行重组。
• 它监听FiRa连接器功能特性的更新并考虑新参数。
• 如果FiRa设备在所有SECID上完成通信,它应该通知GATT服务器并且蓝牙连接应该在蓝牙链路层中止。GATT 服务器返回到设备发现阶段,等待Client的发现。

8.2.3 实现CS的GATT Client的行为

GATT 客户端负责整个服务发现过程。一旦FiRa设备通过了设备发现阶段并建立了蓝牙连接,它应该如下操作:

  1. 客户端应根据蓝牙核心规范执行GATT服务发现。客户端应使用UUID找到CP,并忽略其他GATT对象。
  2. 在找到CP的情况下,客户端应继续在CP GATT Primary Service中进行GATT特征发现。
  3. CS客户端将FiRa连接器能力写入CP端的FiRa连接器能力特征值(在CP端的GATT 服务器的FiRa连接器能力支持写)。在蓝牙连接中止之前,GATT client均可重复此步骤,无论何时需要告知CP设备,相关公开参数需要更新(例如,删除/添加SECID)。
  4. GATT客户端通过写入GATT Server的CCCD特殊特征值描述符,来启用“OUT”控制点特性上的值通知。
  5. GATT客户端根据本文档中描述的数据传输协议开始通过“OUT”和“IN”控制点特征交换数据。
  6. GATT客户端确保在多个蓝牙连接的情况下只有一个GATT服务器与给定的SECID通信。
  7. GATT客户端一直等到GATT服务器在蓝牙链路层断开连接。然后GATT客户端返回到设备发现阶段。

如果在此序列中发生任何不可恢复的错误(例如,主连接设备GATT主要服务结构未被识别,FiRa连接器功能无法正确写入等),GATT客户端应在蓝牙链路层上通过终止与服务器的连接来断开与服务器的连接。然后它将返回到设备发现阶段。