使用响应写入多个低功耗蓝牙特性值

Posted

技术标签:

【中文标题】使用响应写入多个低功耗蓝牙特性值【英文标题】:Writing multiple Bluetooth Low Energy characteristic values with response 【发布时间】:2012-06-11 09:40:29 【问题描述】:

Bluetooth Core Spec V4.0 Vol. 3 G 部分第 4.9.3 节 规定,对于带有响应的特征值的写入,使用属性协议 写入请求 过程。

Bluetooth Core Spec V4.0 Vol 3 Part F 第 3.3.2 节描述,

一旦客户端向服务器发送请求,在收到响应 PDU 之前,该客户端不得向同一服务器发送其他请求。

我想使用 CoreBluetooth 在 ios 应用程序中写入多个响应值。我必须自己管理这个规范吗?或者我可以简单地使用- writeValue:forCharacteristic:type 一次写入所有值,iOS 管理每个请求仅在前一个请求处理后发送?

我猜想 iOS 会管理它,因为根据 Bluetooth Core Spec V4.0 Vol 3 Part F Section 3.4.5.2 Write Response 不包含链接到书面特征。但是,- peripheral:didWriteValueForCharacteristic:error 方法表明 iOS 会以某种方式跟踪响应所链接的特征。

有人可以确认或否认这一点吗?

【问题讨论】:

【参考方案1】:

我认为您在与 CB 打交道时无需过多担心 ATT/GATT。原因是许多使用 CB 的人无法访问蓝牙核心 4.0 规范,他们也不希望阅读它们。

CB 知道如何关联特征的原因是协议规定每个命令和响应都是配对的。当您发送命令时,您将收到响应。

因此您可以多次使用 writeValue,CB 会为您正确排队调用,即它会在下一次写入之前等待 ATT 层的响应。并且委托回调保证与执行写入的顺序相同。

【讨论】:

能否请您在声明中添加来源?此外,bluetooth.org/spec 下的任何人都可以免费获得蓝牙核心规范 4.0 版 您可以使用嗅探器在呼叫时找出空中交通。此外,从逻辑上讲,由于 CB 在需要处理其他请求之前不能依赖您的委托存在或完成,因此它必须处理所有协议事务而不等待委托回调。同样,您无需阅读 1000 页的规范即可使用 CB。如果您有疑问,可以在devforums.apple.com/community/ios/core/cbt 提出同样的问题【参考方案2】:

我能够编写“多个响应请求”,即

[自外设] writeValue:valueToWrite forCharacteristic:dataPointCharacteristic type:CBCharacteristicWriteWithResponse];

在一起 - 实际上我发送了其中的 14 个 - 所有这些都在延迟后返回了回复。但是 - 写入响应不包含写入特征的数据 - 即 - 只有特征内的值在响应中无效。

似乎接近注释“根据蓝牙核心规范 V4.0 Vol 3 Part F 第 3.4.5.2 节,写入响应不包含指向书面特征的链接”,不同之处在于它只是 [characteristc value] 是不正确的 - 但 ios 在内部负责排序。因此,使用写响应(即 BLE 确认)来连接排序逻辑以处理接下来要执行的一系列步骤似乎并不可行。

所以 - 要点是 - 如果您要求 BLE 向外围设备“writeWithReponse”消息“Do Task #1”,则来自外围设备的 BLE 响应是“OK!”。响应并没有告诉您外围设备收到了“Do Task #1”消息,而是类似于 - 是的,我明白了您的意思。我懒得重复你发给我的确切命令 :)

【讨论】:

以上是关于使用响应写入多个低功耗蓝牙特性值的主要内容,如果未能解决你的问题,请参考以下文章

低功耗蓝牙监听多个特征通知

低功耗蓝牙Ble的详细使用流程

低功耗蓝牙 - 反复更新特征值

低功耗蓝牙获取特性描述

从蓝牙低功耗 GATT 特性中检索大的 32 位无符号整数

自定义蓝牙低功耗广告数据和扫描响应数据