Проблема с CoreBluetooth: не удается обнаружить устройство
Я работаю над устройством BLE с именем WIRELESS BLOOD PRESSURE WRIST MONITOR. Я скачал это приложение, и все работает отлично. Но когда я попытался подключиться к устройству из своего приложения, я не получил ответ. и мой код прямо как код от developer.apple.com, а также этот учебник.
Это мой код:
_centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
[_centralManager scanForPeripheralsWithServices:nil options:nil];
Я получаю уведомление о делегате для centralManagerDidUpdateState
но я не получаю didDiscoverPeripheral
даже если я ищу с nil
в сфере услуг.
Когда я иду в Настройка -> Bluetooth: я вижу устройство, и оно подключено, и сигнал Bluetooth включен. Таким образом, iPhone может видеть устройство BLE, поэтому, когда я использовал в своем коде эти методы retrieveConnectedPeripheralsWithServices
чтобы получить список подключенных устройств, возвращается 0 объект.
Так что я не знаю, в чем проблема, имея в виду, что устройство BLE прекрасно работает с собственным приложением, поэтому оно не потребляет энергии, а является классическим, а устройство BLE отображает сигнал Bluetooth при открытии приложения.
Так что любые идеи от подонков:D
Спасибо..
2 ответа
Есть много вещей, о которых нужно позаботиться:
- Вам нужно подождать
centralManagerDidUpdateState
ОтображатьCBCentralManagerStatePoweredOn
, Все, что вы делаете раньше, приведет к ошибке или будет проигнорировано. Итак, ваш призыв кscanForPeripheralsWithServices
вероятно, игнорируется. Это верно для других API, таких какretrieveConnectedPeripheralsWithServices
ты упомянул. - Также возможно, что устройство отключит рекламу после подключения, поэтому сканирование не будет успешным, пока вы не отключитесь от него.
- Сканирование в фоновом режиме имеет много ограничений. Вы можете искать вопросы SO, чтобы узнать подробности. В начале я бы посоветовал вам не пытаться использовать фоновую операцию, поскольку она может быть очень сложной.
Вместо поиска сразу после инициализации центрального менеджера, попробуйте сначала дождаться обновления, что питание включено.
Попробуйте эти шаги:
- В viewDidLoad уберите вызов scanForPeripheralsWithServices
- Добавьте метод scanForPeripherals, который сначала проверит, включен ли Central Manager, а также проверит состояние сканирования (см. Ниже).
код:
- (void)scanForPeripherals {
if (self.centralManager.state != CBCentralManagerStatePoweredOn) {
NSLog(@"CBCentralManager must be powered to scan peripherals. %d", self.centralManager.state);
return;
}
if (self.scanning) {
return;
}
self.scanning = YES;
[self.centralManager scanForPeripheralsWithServices:nil options:@{ CBCentralManagerScanOptionAllowDuplicatesKey: @YES }];
NSLog(@"Scanning started");
}
- В ViewWillAppear вызов [self scanForPeripherals]
- В centralManagerDidUpdateState вызывайте scanForPeripherals, только если центральный менеджер включен.
код:
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
if (central.state != CBCentralManagerStatePoweredOn) {
NSLog(@"CBCentralManager not powered on yet");
return;
}
// The state must be CBCentralManagerStatePoweredOn
[self scanForPeripherals];
}
- Добавьте сканирование свойства BOOL. Использование свойств сканирования позволяет безопасно попробовать и выполнить сканирование до вызова обратного вызова обновления. Вы должны обработать состояние сканирования, чтобы предотвратить вызов сканирования дважды.