在 BLE GATT 配置文件中,是否真的读取或写入了特征?

In BLE GATT profile are characterstics really being read or written?

根据 BLE GATT 配置文件的规范,特征是可以在 GATT 服务器或客户端之间交换的最小数据单元。 GATT 客户端可以请求读取或写入 GATT 服务器上服务下的特征值。但是在我到目前为止看到的大多数 GATT 实现中(Windows 和 Android),服务器端的特性都有事件处理程序,例如 ReadRequested 或 WriteRequested 事件,这些事件在以下情况下触发客户端请求对该特征进行读取或写入。在事件处理程序中,我们可以发送任何我们想要的响应(特性不包含除其 UUID 或其属性之外的任何数据)。在写请求的情况下,服务器从客户端接收数据并选择用它做任何它想做的事情,特性永远不会改变。从技术上讲,这些特征并未被读取或写入。我的问题是为什么原来的特征被读取或写入的概念没有被使用?
PS: 在这里我附上了如何在 UWP 应用程序中创建 GATT 服务器和客户端的 link。
服务器https://docs.microsoft.com/en-us/windows/uwp/devices-sensors/gatt-server
客户:https://docs.microsoft.com/en-us/windows/uwp/devices-sensors/gatt-client

这只是术语。如果您认为更好,可以将其称为“接收”/“发送”而不是“读取”/“写入”。

最初的想法是将值附加到特征上,并由客户端直接read/written。或者由服务器更新,然后向客户端发送包含新值的“通知”(例如温度传感器)。

但是这个模型对于所有配置文件来说是不够的。例如,固件更新不适合此模型。 HID 也没有。因此,允许仅使用特性作为传输数据的方式。由每个配置文件定义如何处理特性的读取和写入。例如,GAP服务中的“姓名”和“外观”特征通常returns一个常量值,可能存储在特征对象中。但是对于 HID,我们具有“控制点”特性,其中值实际上不存储在任何地方。

我已经看到这些 API 变体用于定义不同蓝牙堆栈的特性:

  1. 在特征对象中嵌入特征值,让蓝牙堆栈在内部处理reads/writes。
  2. 不嵌入任何特征值,但公开 read/write 个处理程序。
  3. 在特征对象中为值保留一些space,但有read/write 处理程序可以处理数据before/after writing/reading 来自存储的特征值。

选项 2 最灵活,例如与 Android 的应用程序实现的 gatt 服务一起使用。