BLE食用说明——indicate vs notify
指示和通知是可以通过属性(ATT)协议发送的命令。因此,在ATT层定义了两个角色:
- 客户端设备使用 GATT 协议通过 BLE 链路访问远程资源。通常,主设备也是客户端,但这不是必需的或强制的。
- 服务器设备具有 GATT 数据库、访问控制方法,并向远程客户端提供资源。通常,从属设备也是服务器。
BLE 标准定义了两种服务器向客户端传输数据的方式:通知和指示。规范定义每条消息中的最大数据有效负载大小为 20 字节。通知和指示由服务器发起,但由客户端启用。
- 通知无需确认,因此速度更快。因此,服务器不知道消息是否到达客户端。
- 指示需要确认才能传达。客户端向服务器发送确认消息,这样服务器就知道该消息已到达客户端。ATT 协议定义的一个有趣的事情是,如果没有收到确认,服务器不能发送两个连续的指示。换句话说,您必须等待每个指示的确认才能发送下一个指示。

然而,服务器无法在通信开始时发送指示或通知。首先,客户端必须在服务器端启用通知和指示权限,这样,服务器才被允许发送指示或通知。此过程涉及客户端写入将要通知/指示的特征的客户端特征配置描述符 (CCCD)。
换句话说,客户端可以从服务器请求特定特性的通知。一旦客户端在服务器中启用了此类特性的通知,服务器就可以在值可用时将其发送给客户端。例如,想象一下连接到心率智能手机应用程序的心率传感器应用程序。心率服务可以通知其心率测量特性。在这种情况下,传感器是服务器,而智能手机是客户端。一旦设备连接,智能手机应用程序必须通过其 CCCD 设置心率测量特性的通知权限。然后,当智能手机应用程序(客户端)设置 CCCD 并启用通知时,心率传感器(服务器)能够在心率测量可用时发送通知。如果特性具有指示属性,则需要相同的过程。最后,客户端是允许服务器指示或通知特性的客户端。
最后,值得一提的是,与通知不同,指示更可靠,但速度较慢,因为服务器发送数据,但客户端当接收到数据时。必须确认
浙公网安备 33010602011771号