低功耗蓝牙(BLE)为各种通信方案定义了一个框架。它允许设备发现彼此,广播数据,建立连接以及许多其他基本操作。

主要目标是专注于为BLE堆栈的以下元素定义的过程:

为了全面介绍这些过程,将使用一系列顺序图,重点放在以下各项上:

此外,根据上下文(GAP或GATT协议),序列图将使用主从节点或服务器和客户端的术语。

1)通用访问配置文件(GAP)

为了使两个设备A和B建立BLE连接,必须进行以下操作:一个设备(例如A)必须进行 广告发布,而另一个设备(例如B)必须 扫描 可连接设备。结果,只有扫描设备B可以发起连接。那么,扫描设备B是主设备,而广告设备A是从设备。

1.1)广告和扫描

BLE实现了时分双工方案。这意味着在给定的频道上,一条 物理链路上正在进行双工通信(即发送和接收数据) 。例如,这与有线串行链路不同,在有线串行链路中,TX和RX线将分别用于传输和接收。

结果,可以使用一组定义的可调定时参数:广告间隔,扫描间隔,扫描窗口。有关更多信息,请参考BLE 核心规范 。

有两种扫描方法:被动和主动。在被动扫描中,扫描仪仅接收广告包。在主动扫描中,扫描仪会向广告商发送“扫描请求”消息,其中包含扫描仪的蓝牙地址及其地址类型。

注意:本文不涵盖扩展广告。

1.2)连接成功

扫描仪从广告商那里收集了所有必要的信息后,便可以连接到它。以下顺序图说明了为了成功建立连接而进行的步骤:

蓝牙设置里面堆栈是什么(蓝牙堆栈操作流程图)(1)

请务必注意,扫描仪是启动连接的扫描仪。

1.3)连接启动失败

连接启动失败的发生可能有两个原因:连接启动被取消或超时。设备可以在创建后立即取消挂起的连接。从站必须在给定的时间间隔内响应主站。BLE标准将固定的六个连接间隔数定义 为主机可以保持静默(例如,不发送任何数据包)的限制。如果主机(主机或从机)之一保持沉默的时间更长,则将断开连接。

蓝牙设置里面堆栈是什么(蓝牙堆栈操作流程图)(2)

在此示例中,经过了 六个连接间隔, 但未从从站接收到任何数据通道PDU。结果,连接断开。同样,如果主机在相同的时间间隔内无法将数据通道PDU发送到从机,则连接将断开。

注意:这与监管超时不同。它仅适用于连接发起,换句话说,存在至少一个成功的连接事件,在该事件中,主机和从机之间交换了数据包。

1.4)更新连接参数

建立BLE连接后,可能需要进行一些参数调整。为此,主机,主机或从机都可以触发“连接参数请求”过程。该过程可以在连接启动期间在链路层级别(即,在没有应用程序请求的情况下)触发。BGAPI实现例程 gecko_cmd_le_gap_set_conn_parameters() 来预设参数值。启动连接后,仍然可以在任何时间通过调用 应用程序层中的例程gecko_cmd_le_connection_set_parameters()来更新连接参数 :

蓝牙设置里面堆栈是什么(蓝牙堆栈操作流程图)(3)

此外,上面的序列图还显示了“ GATT MTU交换”子过程。

ATT协议默认将最大传输单元(MTU)定义为23字节。如果连接的两个设备可以支持更大的ATT_MTU值,则触发“ GATT MTU交换”过程以设置ATT协议MTU。在连接发起期间,该过程仅应发起一次。

请注意,在连接会话期间,安全模式和数据通道PDU有效负载长度可能会有所不同。

注意:在“连接参数请求”过程中,主站始终优先于参数决定。换句话说,主机始终具有用于参数协商的“最后一个字”。

2)通用属性配置文件(GATT)

GATT为Bluetooth SIG或用户定义的所有配置文件提供了一个框架。蓝牙配置文件使用分层结构实现:

  • 服务:它们包含在GATT条目中,这些条目将彼此相关的属性分组在一起。特点:它们是数据容器。特征包括一个 声明 (标签)和一个 。描述符:放置在特征下,它们提供有关特征及其值的附加信息。

GATT database *--> Services | --> Characteristics (always placed under a service) | --> Descriptors (always placed under a characteristic)

BLE规范将单个服务中的所有属性称为 服务定义

2.1)主要服务发现

主要服务是GATT服务的标准类型,包括GATT服务器公开的相关标准功能。换句话说,服务是特征的集合。结果,建立连接时,GATT客户端必须能够发现可用的服务。

蓝牙设置里面堆栈是什么(蓝牙堆栈操作流程图)(4)

该过程遍历GATT数据库的所有可用服务, 为发现的每个主要服务生成evt_gatt_service事件。到达列表的末尾后, 堆栈 将引发evt_gatt_end_procedure

一旦客户端获得了服务的句柄范围,就会存在类似的过程,以便检索该服务下的特征的完整列表。

2.2)特征

如前所述,特征是数据容器。它们包含一个 声明 (标签)和一个

有多种类型的特征:

  • 'hex'或'utf-8'特性:它们包含在BLE堆栈内部维护的hex或utf-8值中。“用户”特征:用户特征在应用程序级别上维护。换句话说,收到读/写命令时,应用程序有责任执行适当的操作。

此外,根据给定的特性,可以执行不同类型的读/写操作。我们将在此处着重执行以下过程:

  • 读/写用户特征。长时间读取/写入用户特征。通知和指示

在此我们将不描述以下子过程:

  • 读取多个特征没有回应就写签名写,无回应可靠的写入

有关这些过程的更多信息,请参考BLE 内核规范 和 KBA_BT_0304:不同的特征值类型

2.2.1)读/写十六进制和utf-8类型的特征

BLE堆栈管理这些特性的读取和写入操作。如果是读取,则在接收到“读取请求”后,服务器堆栈将发送回“读取响应”,其中包含如下所示的特征值:

蓝牙设置里面堆栈是什么(蓝牙堆栈操作流程图)(5)

以下序列图描述了写操作:

蓝牙设置里面堆栈是什么(蓝牙堆栈操作流程图)(6)

“写入响应”仅包含一个错误代码,指示写入是否成功。

请注意,如果达到有效负载的最大长度,则BLE堆栈会自动使用读/写长特性。

2.2.2)读取用户特征

“读取特征值”过程是通过 gecko_cmd_gatt_read_characteristic_value() BGAPI命令实现的。在此过程中,特征长度必须小于或等于最大有效负载,即(ATT_MTU-1)字节。换句话说,特征的长度必须适合一个“读取响应”。

蓝牙设置里面堆栈是什么(蓝牙堆栈操作流程图)(7)

数据通过“读取响应”从服务器发送到客户端。然后,客户端应用程序可以通过“ evt_gatt_characteristic_value”事件检索数据。

如果该特性不适合一个“读取响应”,则 可以使用通过gecko_cmd_gatt_read_characteristic_value()例程实现的“读取长特性值”过程 。如果有效载荷大于(ATT_MTU-1),则堆栈将使用gecko_cmd_gatt_read_characteristic_value_from_value()自动打包并发送数据 。调用gecko_cmd_gatt_read_characteristic_value_from_value()并不是应用程序的责任 ,而是,应用程序仍将使用 gecko_cmd_gatt_read_characteristic_value() 例程。下面的序列图描述了使用偏移量例程的“读取长特征值”机制。

蓝牙设置里面堆栈是什么(蓝牙堆栈操作流程图)(8)

客户端通过(ATT_MTU-1)字节块读取特征。客户端堆栈保留并更新用于读取请求的字节偏移量。

2.2.3)写出用户特征

“写入特征值”过程是通过 gecko_cmd_gatt_write_characteristic_value() BGAPI命令实现的。在此过程中,特征长度必须小于或等于最大有效负载,即(ATT_MTU-3)字节。与“读取特征”类似,特征的长度必须适合一个“写入请求”。

蓝牙设置里面堆栈是什么(蓝牙堆栈操作流程图)(9)

对于更长的特征,可以使用同一命令在远程GATT数据库中写入特征。如果有效负载不适合一个请求,则在调用gecko_cmd_gatt_write_characteristic_value()时会自动使用“长写”过程 。该值在服务器端被缓冲,直到发送完所有数据为止。服务器接收到所有数据后,客户端可以发出“执行写入请求”以触发远程GATT数据库中的有效写入。

蓝牙设置里面堆栈是什么(蓝牙堆栈操作流程图)(10)

如果操作成功, 服务器将发送evt_gatt_procedure_completed

2.2.4)通知和指示

服务器启动的更新可以从GATT服务器发送到客户端,而无需客户端请求。这具有节省功率和带宽的优点。服务器启动的更新有两种类型:通知和指示。在这两种情况下,都必须先使用gecko_cmd_gatt_set_characteristic_notification()在远程GATT服务器上启用该过程 。

通知包括特征的句柄(即其标识符)和值。客户端收到通知,但不将任何确认发送回服务器。

蓝牙设置里面堆栈是什么(蓝牙堆栈操作流程图)(11)

另一方面,这些指示具有相同的行为,但需要客户端以确认的形式进行明确确认。如果客户端未发送确认,则服务器将不发送进一步的指示。

蓝牙设置里面堆栈是什么(蓝牙堆栈操作流程图)(12)

指示使用与通知相同的属性协议功能。

3)安全管理器协议(SMP)

安全管理器(SM)既是协议,又是一系列安全算法,旨在为Bluetooth协议栈提供生成和交换安全密钥的能力,然后使对等方可以通过加密链路安全地通信,以信任身份最后,在需要时隐藏公共蓝牙地址,以避免恶意的对等方跟踪特定的设备。

(上述文章阐述归伦茨科技公司所有,转载请注明出处,更多相关信息欢迎关注lenze_tech或lenzetech)

,