首页 > 解决方案 > 蓝牙并发命令

问题描述

我有几个定制的 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 循环来迭代并将命令发送到每个外围设备,我几乎可以肯定这种蛮力方法是错误的方法来完成此任务。我已经进行了一些搜索,但找不到任何关于同时控制设备的正确方法的文献。我真的可以使用一些建议或指导来帮助解决这个问题。实现此行为的最佳实践是什么?

标签: iosswiftbluetoothcore-bluetooth

解决方案


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

向您添加属性以BLEDevice存储对您在发现期间找到的相关特征的引用。

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


推荐阅读