When/How 是 BLE GATT Notify/Indicate 在物理层上发送

When/How is a BLE GATT Notify/Indicate is send on physical layer

我阅读了蓝牙核心规范。 V4.2 /BLE (..)

连接状态下的通信是总是主发起,从returns数据之后。 这里的主人是一个与 GATT 服务器(外围设备)对话的 GATT 客户端。

我不明白 GATT 特性 "notify" 当主机在发送数据之前总是需要请求时,它是如何通过较低层工作的。

有人知道它是如何工作的吗?

BLE 是分时隙的。在连接状态下,有连接事件周期性发生,间隔称为connectionInterval

每个连接事件都是主站发起的,这意味着主站在连接事件中发送第一个数据包。

为了保持连接有效,slave 必须每隔supervisionTimeout至少发送一次数据包(并得到确认) .无论如何,还有其他超时使从设备在此之前做出响应,其中之一是 slaveLatency,即从设备必须响应主设备之前可以忽略的连接事件数(即使没有响应不是断开连接的原因,它可能会导致协议中的其他问题,从而导致断开连接)。另一方面,master 应该在每个连接事件上发送一个数据包。

connectionIntervalslaveLatencysupervisionTimeout是[=26=的定时部分]规范中的连接参数。连接间隔从7.5ms到4秒,slaveLatency从0(然后slave应该响应每个连接事件)到supervisionTimeout[=38对应的连接事件数=] / 2.(完整定义参见 6.B.4.5.1)

因此,基本上,任何有效负载(包括 GATT 通知)都在从属或主控的堆栈缓冲区中排队,直到发生下一个连接事件。无论方向如何(从站到主站或主站到从站),一方都必须等待下一个连接事件才能发送其数据包。

在给定的连接事件中,每一方依次发送一个数据包,可选地不发送任何有用的有效负载,直到没有人再发送任何东西为止。 (参见 6.B.4.5.6)

这意味着如果无线电在第一次尝试时就传输数据包,则通知最多排队等待 connectionInterval

这就是必须正确协商连接参数的原因,这也是它们因设备类型而异的原因。例如,HID(鼠标、键盘、遥控器)通常允许连接,连接间隔小于 10 毫秒,而心率监测器通常允许连接间隔超过一秒。