Примечание: У меня есть доступ как к устройству 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];
}
И чтобы было ясно, это прекрасно работает (каждая попытка) на переднем плане. Это только фоновое сканирование, которое ведет себя странно.