我一直在开发一个应用程序来读取和写入另一个BLE设备的数据。从应用程序的角度来看,我没有任何问题。只是一些我需要澄清的概念性疑虑。所以:
为什么我们需要cccd才能启用通知?
传递ENABLE_INDICATION_VALUE后,是否启用了通知 在外围设备?
ENABLE_INDICATION_VALUE和。之间的主要区别是什么? ENABLE_NOTIFICATION_VALUE,同时执行相同的任务,即发送 连续数据到中央设备?
答案 0 :(得分:4)
如果服务器应启用通知/指示,则客户端需要配置服务器。否则它不会发送任何东西。
没有。 16位描述符值是位字段。目前只定义了两位:通知和指示。您可以设置这两个位,然后如果服务器行为正常,您应该同时获得通知和指示。
服务器可以随时发送通知。可能每个连接事件甚至多个通知,这提供了高性能。服务器只能有一个未完成的指示。客户端需要在服务器发送新指示之前确认接收指示。与通知相比,这会降低性能。请注意,在我看来,使用Android或iOS作为客户端的指示是没用的,因为在应用完全处理指示之前,蓝牙堆栈会发回确认信息。因此,确认是“错误”确认。
答案 1 :(得分:2)
1.为什么我们需要CCCD来启用通知?
首先setCharacteristicNotification() - 启用/禁用本地设备接收来自外围设备的通知
CCCD - 客户端配置特征描述符
“使用CCCD是为了让GATT客户端控制GATT服务器可以向其发送哪种数据包” - 这意味着启用外围设备发送数据。
2.一旦通过ENABLE_INDICATION_VALUE,它是否在外围设备中启用通知?
否。对于每个指示,您必须发送确认声明这是我需要的数据。
3. ENABLE_INDICATION_VALUE和ENABLE_NOTIFICATION_VALUE之间有什么区别?
如果特征值有任何变化,他们都会通知。
ENABLE_NOTIFICATION_VALUE - >如果有任何变化,外围设备将发送,这意味着这可以用于常规通知
ENABLE_INDICATION_VALUE - >如果有任何变化,外设将发送,在下一个连接间隔中将有一个应用程序级别ack(来自ble stack)(一个连接间隔只允许一个指示),然后只有外围设备可以发送新值。这就是我们无法使用ENABLE_INDICATION_VALUE发送常规通知的原因。