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>)并不能告诉我很多。

解决方法

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

没有通用的方法来了解远程服务的需求。您需要通过API文档知道这一点。这等效于从HTTP服务器取回405 Method not allowed错误。由您决定是否允许使用什么方法。特定系统可能会为您提供一种查询它的方法,但可能没有。提供它不是HTTP规范的一部分,同样,它也不是BLE规范的一部分。