Android ble中客户端特征配置描述符中的启用\指示\值和启用\通知\值是什么?

Android ble中客户端特征配置描述符中的启用\指示\值和启用\通知\值是什么?,android,bluetooth-lowenergy,android-bluetooth,android-ble,Android,Bluetooth Lowenergy,Android Bluetooth,Android Ble,我一直在开发一个应用程序,从另一个可编程设备读取和写入数据。从应用程序的角度来看,我没有任何问题。我需要澄清的只是一些概念上的疑问。因此: 为什么我们需要cccd来启用通知 一旦传递了ENABLE_指示值,是否会启用通知 在外围设备中 启用\u指示\u值和 在两者执行相同的任务(即发送)时启用\u通知\u值 向中央设备发送连续数据 如果客户端应启用通知/指示,则需要配置服务器。否则它不会发送任何东西 否。16位描述符值是一个位字段。目前只定义了两个位:通知和指示。您可以设置这两个位,然后您应该得

我一直在开发一个应用程序,从另一个可编程设备读取和写入数据。从应用程序的角度来看,我没有任何问题。我需要澄清的只是一些概念上的疑问。因此:

  • 为什么我们需要cccd来启用通知

  • 一旦传递了ENABLE_指示值,是否会启用通知 在外围设备中

  • 启用\u指示\u值和 在两者执行相同的任务(即发送)时启用\u通知\u值 向中央设备发送连续数据

  • 如果客户端应启用通知/指示,则需要配置服务器。否则它不会发送任何东西

  • 否。16位描述符值是一个位字段。目前只定义了两个位:通知和指示。您可以设置这两个位,然后您应该得到一个通知和一个指示,如果服务器运行正常

  • 服务器可以随时发送通知。甚至可能每个连接事件都有多个通知,这提供了高性能。服务器只能有一个未完成的指示。在服务器发送新的指示之前,客户端需要确认接收到指示。与通知相比,这会降低性能。请注意,在我看来,使用Android或iOS作为客户端的指示是没有用的,因为在应用程序完全处理指示之前,蓝牙堆栈会将确认发送回。因此,确认是“虚假”确认


  • 1.为什么我们需要CCCD来启用通知

    首先setCharacteristicNotification()-启用/禁用本地设备以接收来自外围设备的通知

    CCCD-客户端配置特征描述符

    “CCCD的使用是由GATT客户机控制GATT服务器可以向其发送何种数据包”——这意味着允许外围设备发送数据

    2.一旦通过启用指示值,是否在外围设备中启用通知

    否。对于每个指示,您必须发送确认函,说明这是我需要的数据

    3.启用\指示\值和启用\通知\值之间的区别是什么

    如果特征值有任何变化,它们都会发出通知

    启用通知值->如果有任何更改,外围设备将发送,这意味着这可以用于常规通知


    启用\u指示\u值->外围设备将发送如果有任何更改,将在下一个连接间隔(一个连接间隔只允许一个指示)中出现应用程序级确认(来自ble堆栈),则只有外围设备可以发送新值。这就是为什么我们不能使用“启用指示”值来发送常规通知。

    “现在应用程序必须发送确认”这不是真的对不起!,“现在应用程序必须发送ack,但它将在下一个连接间隔内发送”在Android中,应用程序不会发送任何指示确认(ack),这是由BLE堆栈完成的。对于通知,BLE堆栈根本不发送任何ack(只有数据包本身的链路层ack,但这是另一回事);是的,但是我们只能为一个连接间隔获得一个值,这使得它比其他连接间隔慢。