Bluetooth LE, scanForPeripheralsWithServices в фоновом режиме, увеличение скорости

Я использую Bluetooth LE на iPhone 5S, и я сделал следующее:

  • У меня есть периферийное устройство bluetooth, и я настроил его для рекламы каждые 20 мс на всех трех рекламных каналах bluetooth (37, 38 и 39).

  • Я настроил свое приложение с UIBacgroundModes = bluetooth-central в Info.plist

  • Я запустил scanForPeripheralsWithServices, как показано ниже

код:

NSDictionary *options = @{
    CBCentralManagerOptionRestoreIdentifierKey:@"myCentralManagerIdentifier",
    CBCentralManagerScanOptionAllowDuplicatesKey:[NSNumber numberWithBool:YES]
};
self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:options];    
[self.manager scanForPeripheralsWithServices:[NSArray arrayWithObject:[CBUUID UUIDWithString:@"<uuid removed>"]] options:options];

Текущее состояние:

  • В режиме переднего плана приложение быстро получает рекламные сообщения, когда я запускаю свое периферийное устройство (в течение одной секунды)

  • В фоновом режиме приложение иногда получает рекламные сообщения в течение 10 секунд после запуска периферийного устройства (что может быть приемлемым, даже если оно плохое), однако часто он не получает рекламу в течение очень долгого времени (минуты или больше), и это не работает для приложения.

Вопрос:

Можно ли увеличить скорость сканирования iOS для периферийных устройств Bluetooth 4.0 LE, когда приложение сканирования находится в фоновом режиме? Поскольку я не думаю, что для этого существует общедоступный API, я ищу частный API, который не публикуется Apple. Это для внутреннего корпоративного приложения, поэтому частный API будет в порядке.

Ответ 1

Фоновый режим работает по-разному для сканирования.

  • В каждом периферийном устройстве сообщается только о первом единственном его времени (вы не можете отслеживать близость через RSSI, не подключаясь к нему в фоновом режиме).

  • Вы можете инициировать запрос на подключение к периферийному устройству, которое находится не в пределах диапазона, и соединение будет завершено, когда периферия станет доступной. Не нужно активно сканировать это (кроме начального обнаружения, поэтому вы знаете, какой UUID подключиться).

Возможно, вы можете решить проблему, отправив запрос на соединение вместо сканирования, находясь в фоновом режиме. Таким образом, iOS знает, что вас действительно интересует конкретное периферийное устройство, и я могу себе представить, что это влияет на время обнаружения.

В зависимости от вашей цели другой подход может заключаться в обратном подключении, помещая iPhone в периферийном режиме и используя текущие периферийные устройства LE в центральном режиме. Кажется, хаки, но если он решает проблему для вашего дела: почему бы и нет:)

Что касается частного API: извините, я не знаю, что влияет на параметры сканирования.