#ios #swift #bluetooth-lowenergy #core-bluetooth #cbcentralmanager
Вопрос:
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()
}
}
Ответ №1:
«Периферийное устройство находится в режиме подключения, потому что другие смартфоны не могут его обнаружить». Вы имели в виду, что другие смартфоны могут его обнаружить?
Учитывая телефоны, которые вы указали как работающие и не работающие, я бы ожидал, что у вашей платы возникли проблемы с Bluetooth 5 (который впервые был поддержан на iPhone 8). NRF52 поддерживает BT5 (он поддерживает 5.2), но если вы написали свою собственную прошивку, возможно, вы нарушили поддержку. Я бы начал с того, что убедился, что вы используете самый ванильный код, который только можете из Nordic.
Комментарии:
1. Я имел в виду, что периферийное устройство исчезает со сканеров, когда оно зависает на этапе подключения к смартфону, т. е. кажется, что оно работает нормально без ошибок и отключений, на некоторых устройствах оно просто не может полностью подключиться. Я написал свой код на основе приложения nRF Blinky, конечно, он был довольно сильно изменен, но основа и общие шаблоны остались неизменными. Фактически, я заменил сервисы и характеристики UUID и добавил многие из своих собственных. Вы сказали, что проблема может быть в прошивке самой платы, я постараюсь найти проблему там, спасибо
2. Итак, мы установили оригинальную прошивку для NRF52 (UART), на основе которой было написано наше программное обеспечение, и подключение прошло успешно, и, по-видимому, проблема действительно на стороне периферийного устройства. Спасибо за подсказку!