【问题标题】:iOS determine data length of CBCharacteristiciOS确定CBCharacteristic的数据长度
【发布时间】:2021-02-17 13:01:03
【问题描述】:

有什么方法可以动态地嗅出一个 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>) 并不能告诉我太多信息。

【问题讨论】:

    标签: ios bluetooth bluetooth-lowenergy core-bluetooth ios-bluetooth


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的确认。我担心会是这样。我在小工具端使用 ST-BLUENRG 芯片,它的 ACI 协议(这是一个简化的 GATT/GAP API)为 gatt 定义提供了一个字段宽度。所以它必须捕获并引发错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多