Не удается подключиться к BLE Peripheral на некоторых устройствах iOS

BLE отлично работает на 7 Plus (iOS 14.4.2) и 6 (iOS 12). Но на XR (14.4.2) и 11 подключение зависло после centralManager.connect(peripheral, options: nil) (бесконечное подключение)

Периферийное устройство находится в режиме подключения, поскольку другие смартфоны не могут его обнаружить. Сначала думал, что проблема в радиомодуле самого периферийного устройства (NRF52), но проблема возникла и с отладочной платой. Перезагрузка смартфона не помогла. Забавно, что приложение отлично работает на MacBook с чипом M1.

Часть кода:

// Peripheral model

init(withPeripheral peripheral: CBPeripheral, advertisementData advertisementDictionary: [String : Any], andRSSI currentRSSI: NSNumber, using manager: CBCentralManager) {
    centralManager = manager
    basePeripheral = peripheral
    RSSI = currentRSSI
    super.init()
    advertisedName = parseAdvertisementData(advertisementDictionary)
    basePeripheral.delegate = self
}

public func connect() {
    centralManager.delegate = self
    centralManager.connect(basePeripheral, options: nil)
    print("Connecting to \(advertisedName ?? "device")...") 
// logs stops here
}

public func disconnect() {
    centralManager.cancelPeripheralConnection(basePeripheral)
    print("Cancelling connection with \(advertisedName ?? "device")...")
// triggers on VC dismiss
}

func centralManagerDidUpdateState(_ central: CBCentralManager) {
    if central.state != .poweredOn {
        print("Central Manager stated changed to \(central.state)")
    }
}

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    if peripheral == basePeripheral {
        print("Connected to \(advertisedName ?? "device")")
        delegate?.peripheralDidConnect()
        discoverPrimaryServices()
    }
}

func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
    if peripheral == basePeripheral {
        print("Disconnected from \(advertisedName ?? "device")")
        delegate?.peripheralDidDisconnect()
    }
}

person Tim Yumalin    schedule 18.05.2021    source источник


Ответы (1)


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

Учитывая телефоны, которые вы указали как работающие и не работающие, я ожидаю, что у вашей платы проблемы с Bluetooth 5 (который впервые был поддержан на iPhone 8). NRF52 поддерживает BT5 (он поддерживает 5.2), но если вы написали свою собственную прошивку, вы, возможно, нарушили поддержку. Я бы начал с того, что убедился, что вы используете самый ванильный код из Nordic.

person Rob Napier    schedule 18.05.2021
comment
Я имел в виду, что периферийное устройство пропадает со сканеров при зависании на этапе подключения к смартфону т.е. вроде нормально работает без ошибок и отключений, на некоторых устройствах просто не может полноценно подключиться. Я написал свой код на основе приложения nRF Blinky, конечно, он был довольно сильно модифицирован, но основа и общие закономерности остались неизменными. По сути, я заменил сервисы и характеристики UUID и добавил много своих. Вы сказали, что проблема может быть в прошивке самой платы, попробую поискать проблему там, спасибо - person Tim Yumalin; 19.05.2021
comment
Итак, мы установили оригинальную прошивку для NRF52 (UART), на основе которой был написан наш софт и подключение прошло успешно, и видимо проблема действительно на стороне периферийного устройства. Спасибо за подсказку! - person Tim Yumalin; 19.05.2021