ios - programming - xcode bluetooth explorer
Escaneo continuo para iOS CoreBluetooth Central Manager? (3)
Un periférico no se puede conectar a más de una central. Pero si solo necesitas capturar el RSSI, ni siquiera necesitas conectarte. El escaneo de dispositivos puede recuperar el RSSI usando esta función:
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
Las especificaciones de Bluetooth de baja energía no dicen mucho acerca de si los periféricos se pueden conectar a más de una central a la vez, pero las pruebas de experiencia me dicen que no pueden.
Debido a que mi aplicación requiere una relación no posesiva con periféricos (es decir, no hay conexiones, lo que bloquearía otras), y necesita actualizar constantemente sus valores RSSI, estoy buscando una forma de buscar continuamente periféricos y capturar sus valores RSSI.
El método scanForPeripheralsWithServices parece escanear durante un cierto intervalo y luego se detiene. Creo que mi mejor opción es escanear durante 3 segundos a la vez, detener Escaneo, esperar (varios segundos) y luego reiniciar un escaneo. Repetir.
¿Alguien puede señalar una mejor manera de hacerlo? Por ejemplo, ¿configurar un periférico para conectarse a más de un Central?
En cuanto a la respuesta anterior, si solo está interesado en RSSI, simplemente puede obtenerlo en el método delegado:
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
Por cierto, de forma predeterminada, el CBCentralManager
solo llamará a este método una vez. Si necesita que se llame a esta devolución de llamada cada vez que CBCentralManager
recibe un paquete de publicidad, debe iniciar el escaneo con la opción CBCentralManagerScanOptionAllowDuplicatesKey
establecida en YES
:
NSDictionary *scanningOptions = @{CBCentralManagerScanOptionAllowDuplicatesKey: @YES};
[centralManager scanForPeripheralsWithServices:nil options:scanningOptions];
Tenga en cuenta que Apple desaconseja el uso de esta opción si no es estrictamente necesario.
Ver: iOS Developer Library: mejores prácticas para interactuar con un dispositivo periférico remoto
Resolví este tipo de problema con este código, básicamente reiniciando el escaneo cada vez que se procesa un anuncio. Estaba enfrentando el mismo problema donde la instancia de CBCentralManager dejaría de escuchar un periférico.
(Establecer CBCentralManagerScanOptionAllowDuplicatesKey
para @YES
no resolvió completamente el problema para mí).
Suponiendo que la clase implemente CBCentralManagerDelegate:
- (id) init {
self.central = [[CBCentralManager alloc]initWithDelegate:self queue:nil];
[self initScan];
}
- (void) initScan {
[self.central stopScan];
[self.central scanForPeripheralsWithServices:nil
options:[NSDictionary dictionaryWithObjectsAndKeys:@NO, CBCentralManagerScanOptionAllowDuplicatesKey, nil]];
}
- (void) centralManager:(CBCentralManager*)central didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary*)advertisementData RSSI:(NSNumber*)RSSI {
//
// Do stuff here
//
[self initScan];
}