首页 > 解决方案 > iOS确定CBCharacteristic的数据长度

问题描述

有没有办法动态地嗅出 CBCharacteristic 的数据长度?

我正在改进我拥有的小工具上的特征 API,并且我想更改其中一个特征的字段宽度。如果我在 iOS 端进行更改,使其写入 9 字节而不是 7 字节的值,则具有旧 API(特征字段宽度为 7)的设备在我尝试写入时会导致以下情况发生价值:

Error Domain=CBATTErrorDomain Code=13 "The value's length is invalid." UserInfo={NSLocalizedDescription=The value's length is invalid.}

我想确定的是我是否可以捕获该错误,然后以某种方式查询 CBCharacteristic 它的当前字段宽度是多少。显然,在某些时候,它确定了这一点9 > 7并导致错误冒泡。我尝试阅读与特征相关的描述符,但只有一个描述符 ( <CBDescriptor: 0x2830cbe40, UUID = Client Characteristic Configuration, value = 2>) 并不能告诉我太多信息。

标签: iosbluetoothbluetooth-lowenergycore-bluetoothios-bluetooth

解决方案


这是由外围设备而不是 iOS 生成的标准 ATT 协议错误。这意味着您发送了一个值,并且外围设备响应该值的长度错误。特征不一定有特定的长度。正确的长度可能取决于上下文。例如,一个特征可能接受 2 个字节、4 个字节或 8 个字节。如果您写入 7 个字节,它可能会返回此错误。或者第一个字节可能是命令选择器,其余的可能是该命令需要具有特定长度的有效负载。这些设计没有简单的“这个特征的长度是多少”。

没有通用的方法可以知道远程服务想要什么。您需要通过 API 文档了解这一点。这相当于405 Method not allowed从 HTTP 服务器返回错误。由您决定允许使用哪些方法。一个特定的系统可能会给你一种查询它的方法,它可能不会。提供它不是 HTTP 规范的一部分,同样它也不是 BLE 规范的一部分。


推荐阅读