蓝牙并发命令

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 没有发现的CBCharacteristics 的属性?我建议您为每个外围设备上发现的每个特征存储一个单独的 CBCharacteristic 实例。 @Paulw11 感谢您指出这一疏忽!我向 BLEDevice 添加了一个属性来存储你所说的特性,它现在实际上正在使用蛮力方法。我会看看是否有人提出更好的方法(如果可能的话)在没有 for 循环的情况下实现它。 +1! 【参考方案1】:

您需要为您连接的每个外围设备存储相关特征的特定实例。

将属性添加到您的BLEDevice 以存储对您在发现过程中发现的相关特征的引用。

没有其他方法可以将数据发送到每个外围设备;您需要遍历外围集合并将数据写入每个集合。

【讨论】:

以上是关于蓝牙并发命令的主要内容,如果未能解决你的问题,请参考以下文章

uniapp 通过蓝牙连接设备并发送命令

蓝牙命令 - 有啥可能

怎样使用ADB命令强制关闭蓝牙!

蓝牙bluez命令

蓝牙连接失败,使用 bluetoothctl 命令

从蓝牙命令控制 AVAudioRecorder