我读了蓝牙核心规范。 V4.2 / BLE(..)
连接状态下的通信始终主机启动,从机返回数据。 这里的主人是与GATT服务器(外围设备)交谈的GATT客户端。
当主设备在发送数据之前总是要求时,我不明白GATT功能“通知”它如何通过较低层工作。
有人知道它是如何运作的吗?
答案 0 :(得分:2)
BLE是时间戳。在连接状态下,会有定期发生的连接事件,其间隔名为 connectionInterval 。
每个连接事件都是主启动的,这意味着主服务器在连接事件中发送第一个数据包。
为了保持连接活动,slave 有每 supervisionTimeout 至少发送一次数据包(并得到确认)。还有其他超时使得从站在此之前做出响应,其中一个是 slaveLatency ,即从站在响应master之前可以忽略的连接事件的数量(即使没有响应不是断开的原因,它可能导致协议中的其他问题,从而断开连接)。另一方面,master应该在每个连接事件上发送一个数据包。
connectionInterval , slaveLatency 和 supervisionTimeout 是规范中连接参数的计时部分。连接间隔范围为7.5 ms至4秒, slaveLatency 从0(然后slave应响应每个连接事件)到与 supervisionTimeout / 2对应的连接事件数。(完整定义见6.B.4.5.1)
因此,基本上,任何有效负载(包括GATT通知)都在从机或主机的堆栈缓冲区中排队,直到下一个连接事件发生。无论方向(主设备或从设备到从设备),方必须等待下一个连接事件发送其数据包。
在给定的连接事件中,每个参与方轮流发送一个数据包,可选地没有任何有用的有效负载,直到没有人再发送任何内容为止。 (见6.B.4.5.6)
这意味着如果无线电获取第一次尝试传输的数据包,则通知最多排队等待 connectionInterval 。
这就是为什么必须正确协商连接参数的原因,这也是为什么它们根据设备类型而不同的原因。例如,HID(鼠标,键盘,遥控器)通常允许连接间隔小于10毫秒,而心率监测器通常连接间隔超过一秒。