Проблема с CoreBluetooth: не удается обнаружить устройство


Я работаю над устройством BLE под названиембеспроводной монитор артериального давления на запястье . Я скачал эти приложения, и все работает отлично. Но когда я попытался подключиться к устройству из моего приложения, я не получил ответа. и мой код такой же прямой, как и код из 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 3

2 ответа:

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

  1. вам нужно дождаться, пока centralManagerDidUpdateState укажет CBCentralManagerStatePoweredOn. Все, что вы делаете раньше, либо приведет к ошибке, либо будет проигнорировано. Так что ваш вызов scanForPeripheralsWithServices, вероятно, проигнорирован. Это справедливо и для других API, таких как retrieveConnectedPeripheralsWithServices, о которых вы упомянули.
  2. также возможно, что устройство отключает рекламу после подключения, поэтому сканирование не будет успешным, пока вы не отключитесь от него.
  3. сканирование в фоновом режиме имеет много ограничения. Вы можете искать вопросы SO, чтобы узнать подробности. В начале я бы посоветовал вам не пробовать фоновую операцию, так как она может быть очень сложной.

Вместо поиска сразу после инициализации Центрального менеджера, попробуйте сначала дождаться обновления, что питание включено.

Попробуйте выполнить следующие действия:

  • в viewDidLoad удалить вызов scanForPeripheralsWithServices
  • Добавьте метод scanForPeripherals, который сначала проверит, включен ли Центральный менеджер, а также проверит состояние сканирования (см. ниже).

Код:

- (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");
}
  • In ViewWillAppear call [self scanForPeripherals]
  • в centralManagerDidUpdateState вызовите scanForPeripherals, только если включен central manager.

Код:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
    if (central.state != CBCentralManagerStatePoweredOn) {        
        NSLog(@"CBCentralManager not powered on yet");
        return;
    }    
    // The state must be CBCentralManagerStatePoweredOn
    [self scanForPeripherals];
}
  • Добавьте сканирование свойств BOOL. Использование свойства сканирования позволяет безопасно выполнить проверку перед вызовом обратного вызова обновления. Вы должны обрабатывать состояние сканирования, чтобы предотвратить вызов сканирования дважды.