Параллельные команды через Bluetooth - PullRequest
0 голосов
/ 11 мая 2018

У меня есть несколько пользовательских светодиодных ламп BLE (периферийные устройства).Я реализовал вспомогательный класс Bluetooth (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 для итерации и отправки командык каждому периферийному устройству, и я почти уверен, что этот метод грубой силы является неправильным способом для достижения этой цели.Я провел некоторые поиски, но не смог найти никакой литературы о том, как правильно управлять устройствами одновременно.Я мог бы действительно использовать некоторые советы или указания, чтобы помочь решить эту проблему.Какова лучшая практика для достижения этого поведения?

1 Ответ

0 голосов
/ 11 мая 2018

Вам необходимо сохранить конкретный экземпляр соответствующей характеристики для каждого периферийного устройства, к которому вы подключены.

Добавьте свойства к вашему BLEDevice для хранения ссылок на соответствующие характеристики, которые вы найдете во время обнаружения.

Нет другого способа отправить данные на каждое из периферийных устройств; Вам нужно перебрать свою периферийную коллекцию и записать данные в каждую из них.

...