蓝牙并发命令
Posted
技术标签:
【中文标题】蓝牙并发命令【英文标题】:Concurrent Commands over Bluetooth 【发布时间】:2018-05-10 22:30:26 【问题描述】:我有几个定制的 BLE LED 灯(外围设备)。我已经实现了一个蓝牙助手类(CBCentralManager 和相关的委托方法),并且可以单独连接和控制每个灯而不会出现问题。我已经处理了所有基本的检索/连接/通知逻辑,而且效果很好。
我的下一步是连接到多个灯并基本上同时控制它们(或尽可能接近)。为了管理不同的活动外设,我创建了一个字典来存储它们,使用 UUID 作为键(BLEDevice 包含一个外设属性,我在其中存储引用):
class BLEDevice
var uuid: String!
var peripheral: CBPeripheral!
var rssi: NSNumber!
var name: String!
var advertData: [String: Any]!
var type = 0
init()
var bleDeviceDict: [String: BLEDevice] = [:]
这个字典在检索过程中被填充,然后我为每个字典做一个连接请求。在连接、服务发现、特征发现等成功后,我更新字典对象。我能够毫无问题地连接到每个设备,但是当我尝试发送任何命令(带有或不带有响应标志)时,我得到的操作不可靠。有时效果很好,有时会抛出以下错误:
[CoreBluetooth] WARNING: <CBCharacteristic: 0x129701430, UUID = FFE1, properties = 0x1C, value = <45080154>, notifying = YES> is not a valid characteristic for peripheral <CBPeripheral: 0x127e0ad70, identifier = 44CDB018-2A5C-D776-7641-7F193470945A, name = 3CA5090A21AFED, state = connected
>
为了发送组命令,我设置了一个基本的 for 循环来遍历并将命令发送到每个外围设备,我几乎可以肯定这种蛮力方法是完成此任务的错误方法。我进行了一些搜索,但找不到任何关于同时控制设备的正确方法的文献。我真的可以使用一些建议或指导来帮助解决这个问题。实现此行为的最佳实践是什么?
【问题讨论】:
为什么你的BLEDevice
没有发现的CBCharacteristic
s 的属性?我建议您为每个外围设备上发现的每个特征存储一个单独的 CBCharacteristic
实例。
@Paulw11 感谢您指出这一疏忽!我向 BLEDevice 添加了一个属性来存储你所说的特性,它现在实际上正在使用蛮力方法。我会看看是否有人提出更好的方法(如果可能的话)在没有 for 循环的情况下实现它。 +1!
【参考方案1】:
您需要为您连接的每个外围设备存储相关特征的特定实例。
将属性添加到您的BLEDevice
以存储对您在发现过程中发现的相关特征的引用。
没有其他方法可以将数据发送到每个外围设备;您需要遍历外围集合并将数据写入每个集合。
【讨论】:
以上是关于蓝牙并发命令的主要内容,如果未能解决你的问题,请参考以下文章