CoreBluetooth может принимать команды только в состоянии подключения

[CoreBluetooth] API MISUSE: <CBPeripheral: 0x281310820, identifier = 75450BB1-97A7-5648-38FD-B27572F19EDD, name = ESP32 test, state = disconnected> can only accept commands while in the connected state

Это ошибка, которую CoreBluetooth выдает, когда я пытаюсь

peripheral.discoverServices([CBUUID(string: "4fafc201-1fb5-459e-8fcc-c5c9c331914b")])

Кто-нибудь знает, что происходит?

Вот делегат didDiscover:

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
    var peripheralName: String!
    if let name = advertisementData[CBAdvertisementDataLocalNameKey] as? String {
        peripheralName = name
    }
    else {
        peripheralName = "Unknown"
    }
    
    if(advertisementData[CBAdvertisementDataServiceUUIDsKey] != nil) {
        //print(advertisementData)
        let Ids: [CBUUID] = advertisementData[CBAdvertisementDataServiceUUIDsKey] as! [CBUUID]
        if(Ids.count == 1) {
            print(Ids[0])
            let newPeripheral = Peripheral(id: peripherals.count, name: peripheralName, rssi: RSSI.intValue)
            //print(newPeripheral)
            /*
            if let services = peripheral.services {
                for service in services {
                    print("servizio")
                    //peripheral.discoverCharacteristics([CBUUID(string: "4fafc201-1fb5-459e-8fcc-c5c9c331914b")], for: service)
                }
            }*/
            if(accepted_services.contains(Ids[0].uuidString)) {
                print(newPeripheral)
                peripherals.append(newPeripheral)
                peripheral.delegate = self
                peripheral.discoverServices([CBUUID(string: "4fafc201-1fb5-459e-8fcc-c5c9c331914b")])
                //peripheral.discoverCharacteristics([CBUUID(string: "beb5483e-36e1-4688-b7f5-ea07361b26a8")], for: <#CBService#>)
            }
        }
    }
}

EDIT: я попытался сначала подключиться к периферийному устройству, НО есть еще одна ошибка:

[CoreBluetooth] API MISUSE: Cancelling connection for unused peripheral <CBPeripheral: 0x2829e01e0, identifier = 75450BB1-97A7-5648-38FD-B27572F19EDD, name = ESP32 test, state = connecting>, Did you forget to keep a reference to it?

это реальный код:

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String:Any], rssi RSSI: NSNumber) {
    print("scoperto peripheral")
    myCentral.connect(peripheral, options: nil)
}

Что это означает?


person SquareInc    schedule 19.12.2020    source источник
comment
Отвечает ли это на ваш вопрос? iOS Core Bluetooth: получение предупреждения о неправильном использовании API   -  person El Tomato    schedule 19.12.2020
comment
это проблема состояния питания, когда вы пытаетесь подключиться, когда Bluetooth выключен. Моя проблема в другом   -  person SquareInc    schedule 19.12.2020


Ответы (1)


Вы несете ответственность за то, чтобы где-то хранить ссылку на CBPeripheral. Об этом говорит вам сообщение (Вы забыли сохранить ссылку на него?) Вы создаете Peripheral (который, как я предполагаю, является пользовательской структурой или классом), но у него есть только имя, а не CBPeripheral. Это означает, что в конце didDiscover на CBPeripheral ничего не ссылается, и он освобождается.

person Rob Napier    schedule 19.12.2020
comment
Спасибо! Теперь, кажется, работает. Я добавил эту переменную в начале: public var strong_reference: [CBPeripheral] = [CBPeripheral](), и когда я получаю CBPeripheral, я сохраняю ее. Большое спасибо. Я не знаю, почему это работает. Теперь он вызывает didDiscoverServices и didDiscoverCharacteristicsFor, но не видит никакой характеристики. Это странно. Спасибо еще раз! - person SquareInc; 19.12.2020
comment
Если ответ Роба решил ваш вопрос, вам следует рассмотреть возможность его принятия. - person RyuX51; 21.07.2021