Длительное сканирование BLE в фоновом режиме работает только иногда - PullRequest
0 голосов
/ 12 мая 2018

Примечание: У меня есть доступ как к устройству BLE, так и к программному обеспечению, поэтому решение может включать изменение либо.

Проблема:

Периферийное устройство может подключаться и передавать необходимые данные только в течение 25-30% попыток.

Информация о периферийных устройствах BLE:

  • Использование Bluetooth 4.2 и TI BLE Stack 1.5
  • Передача в течение 30 секунд с интервалом 20 мс
  • Использование обычной рекламы
  • Выполнены рекламные рекомендации на https://developer.apple.com/library/content/qa/qa1931/_index.html
  • Устройство полностью выключается через 30 секунд, поэтому оно должно повторно рекламироваться и быть повторно обнаружено.

Информация о BLE центральном:

Несколько замечаний:

  • Устройство полностью выключается через 30 секунд, поэтому его необходимо открыть заново.
  • В течение этих 30 секунд кажется, что если соединение не будет установлено в течение первых 3 или 4 секунд, оно никогда не будет установлено. Я довольно смущен, почему это может иметь место. (Мое лучшее предположение, что это как-то связано с тем, как фазы выстраиваются)

У кого-нибудь есть идеи, почему мы испытываем такое поведение и как мы можем исправить либо BLE-периферию, либо центральную, чтобы максимизировать вероятность обнаружения и подключения?

UPDATE:

Вот все связанные с BLE части моего кода через периферийное обнаружение:

По моему AppDelegate.h:

@property (nonatomic, strong) NSArray *services;
@property (nonatomic, strong) NSArray *characteristics;

@property (nonatomic, strong) CBCentralManager *centralManager;
@property (nonatomic, strong) CBPeripheral *peripheral;

По моему AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.services = @[[CBUUID UUIDWithString: @"A1B0"]];
    self.characteristics = @[[CBUUID UUIDWithString: @"0321"]];

    self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
}

- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
  switch ([central state]) {
    case CBCentralManagerStateUnauthorized:
      NSLog(@"*** This app is not authorized to use Bluetooth Low Energy ***");
      break;
    case CBCentralManagerStatePoweredOff:
      NSLog(@"*** Bluetooth on this device is currently powered off ***");
      break;
    case CBCentralManagerStatePoweredOn:
      [self.centralManager scanForPeripheralsWithServices:self.services options:nil];
      break;
    default:
      NSLog(@"*** The state of the BLE Manager is unknown ***");
  }
}

- (void) centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
  self.peripheral = peripheral;
  [self.centralManager connectPeripheral:peripheral options:nil];
}

И чтобы было ясно, это прекрасно работает (каждая попытка) на переднем плане. Это только фоновое сканирование, которое ведет себя странно.

...