2012-03-28 5 views
13

Acabo de comenzar con el framework core bluetooth para iOS y estoy desarrollando una aplicación que necesita buscar constantemente dispositivos BLE para que pueda recuperar su número RSSI cada minuto o asi que.Bluetooth básico: actualizaciones constantes de RSSI de dispositivos dentro del rango

Actualmente tengo:

manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; 
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
[manager scanForPeripheralsWithServices:nil options:options]; 

esto empieza mi escaneo de aplicaciones para dispositivos BLE y llama a este método delegado cuando se descubre un dispositivo:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { 
    NSLog(@"Did discover peripheral. peripheral: %@ rssi: %@, UUID: %@ advertisementData: %@ ", peripheral, RSSI, peripheral.UUID, advertisementData); 
    //Do something when a peripheral is discovered. 

    rssiLabel.text = [RSSI stringValue]; 

    [manager retrievePeripherals:[NSArray arrayWithObject:(id)peripheral.UUID]];} 

este método me pone número de RSSI del dispositivo encargado puedo mostrar. La última línea a continuación, llama a este método delegado:

- (void) centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *)peripherals { 

    NSLog(@"Currently known peripherals :"); 
    int i = 0; 
    for(CBPeripheral *peripheral in peripherals) { 
     NSLog(@"[%d] - peripheral : %@ with UUID : %@",i,peripheral,peripheral.UUID); 

    } 

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
    [manager scanForPeripheralsWithServices:nil options:options]; 

} 

Este código parece estar funcionando y hacer una exploración más o menos cada 1 minuto, pero no sé exactamente por qué trabajar ...

la documentación en bluetooth básico es bastante escaso así que si alguien tiene alguna idea sobre cómo hacer esto, o tiene una mejor manera de hacer lo que estoy tratando de lograr, agradecería la ayuda.

+0

parece estar funcionando ... ¿Con qué frecuencia se actualiza el RSSI? EDITAR: ¿Una vez por minuto?Creo que hay un tiempo de espera cuando no se conecta, por lo que comienza el escaneo otra vez. – chwi

+0

Acabo de comenzar a leer la documentación yo mismo, por lo que está más adelante que yo. Pregunta, ¿por qué llama a scanForPeripheralsWithServices en el método de delegado didRetrievePeripherals? Ya lo llamas después de asignar CBCentralManager. Esto puede estar causando el escaneo repetitivo que mencionaste. – mkr707

+0

solo mis dos centavos para> = 7.0: retrievePeripheralsWithIdentifiers necesita usarse a partir de ahora. –

Respuesta

20

¿Ha intentado cambiar la opción de escaneo a SÍ?

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
[manager scanForPeripheralsWithServices:nil options:options]; 

Si usted hace esto usted recibirá su devolución de llamada "didDiscoverPeripheral" con todos los paquetes de publicidad que es visto por su iPhone, que normalmente sería aproximadamente cada 100 ms (aunque veo este tiempo de devolución de llamada varía mucho por la misma dispositivo). Esto incluye el RSSI de cada dispositivo que ve.

Esto debería ser mucho más rápido que la tasa de actualización de ~ 1 minuto.

Implementación
+1

¿Cuál es el equivalente de Swift para esas dos líneas? – Gerard

+0

@Gerard: Vea mi respuesta a continuación. – kbpontius

+1

Swift3: 'manager.scanForPeripherals (withServices: [sensorTagAdvertisingUUID], opciones: [CBCentralManagerScanOptionAllowDuplicatesKey: NSNumber (value: true)])' – nablahero

3

Por lo que puedo ver, esto debería hacer lo que quiera.

Cuando comenzó a buscar periféricos con la llamada original, su delegado debería comenzar a recibir llamadas cada vez que se detecta un dispositivo BLE. Esto continuará hasta que detenga la exploración con una llamada a

[manager stopScan]; 

no creo que realmente necesita la segunda llamada a scanForPeripheralsWithServices en su centralManager: método didRetrievePeripherals, ya que, por lo que yo sé, el escaneo doesn No te detengas hasta que lo digas. Todavía estoy comenzando con esto, también, y aún puede haber un tiempo de espera que no he encontrado.

Estoy bastante seguro de que el motivo por el que recibe una llamada una vez por minuto es porque el dispositivo BLE solo anuncia eso a menudo. Si se anuncia con más frecuencia, como un dispositivo en modo de descubrimiento, creo que recibirá las llamadas con más frecuencia. Sería interesante si pudieras confirmar eso. Si el dispositivo tiene un modo de descubrimiento, puede intentar activarlo para ver si los avisos se aceleran.

2

No debe hacer un escaneo continuo ya que es muy costoso para la energía. Una vez que descubrió los dispositivos, tiene una matriz de objetos CBPeripheral devueltos. En CBPeripheral puede leer RSSI y recibir una devolución de llamada cuando se modifique RSSI. Consulte la siguiente documentación: http://developer.apple.com/library/mac/#documentation/CoreBluetooth/Reference/CBPeripheralDelegate_Protocol/translated_content/CBPeripheralDelegate.html

+0

¿'- [readRSSI] 'requiere que se conecte el periférico? –

+2

@BenMosher sí lo hace. – luxcem

1

Swift de la solución @Anders:

manager.scanForPeripheralsWithServices(nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey : NSNumber(bool: true)]) 
Cuestiones relacionadas