Проблема с 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 ответа

Решение

Есть много вещей, о которых нужно позаботиться:

  1. Вам нужно подождать centralManagerDidUpdateState Отображать CBCentralManagerStatePoweredOn, Все, что вы делаете раньше, приведет к ошибке или будет проигнорировано. Итак, ваш призыв к scanForPeripheralsWithServices вероятно, игнорируется. Это верно для других API, таких как retrieveConnectedPeripheralsWithServices ты упомянул.
  2. Также возможно, что устройство отключит рекламу после подключения, поэтому сканирование не будет успешным, пока вы не отключитесь от него.
  3. Сканирование в фоновом режиме имеет много ограничений. Вы можете искать вопросы 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. Использование свойств сканирования позволяет безопасно попробовать и выполнить сканирование до вызова обратного вызова обновления. Вы должны обработать состояние сканирования, чтобы предотвратить вызов сканирования дважды.
Другие вопросы по тегам