ios - 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 文档了解这一点。这相当于405 Method not allowed
从 HTTP 服务器返回错误。由您决定允许使用哪些方法。一个特定的系统可能会给你一种查询它的方法,它可能不会。提供它不是 HTTP 规范的一部分,同样它也不是 BLE 规范的一部分。
推荐阅读
- python - 如何通过 api (Python) 在 Odoo 13 中更新销售订单的状态?
- matrix - 机器学习正定矩阵
- amazon-web-services - 是否可以生成一个允许上传多个唯一对象的预签名 URL?
- c++ - 如何在 C++ 中获取集合的倒数第二个元素?
- javascript - 使用 JavaScript 从隐藏的输入值字段中检索 PHP 变量
- google-sheets - 谷歌表格中有鼠标悬停的选项吗?
- c# - Unity 编辑器捕获“按住鼠标并移动”事件
- sql - 如何使用 REGEX 或 SQL 查询检测汉字?
- ruby - 如何使用 Cucumber、Capybara 和 Ruby 登录基本授权模式浏览器
- html - 如何设置嵌套柔性显示的边距/填充?