2012-03-28 22 views
13

Ho appena iniziato con il framework bluetooth principale per iOS e sto sviluppando un'app che ha bisogno di scansionare costantemente i dispositivi BLE in modo da poter recuperare il loro numero RSSI ogni minuto o così.Core Bluetooth - aggiornamenti costanti RSSI dei dispositivi di fascia alta

Attualmente ho:

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

questo inizia la mia scansione app per dispositivi BLE e chiama questo metodo delegato quando un dispositivo viene scoperto:

- (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]];} 

questo metodo mi ottiene il numero di RSSI della periferica che posso mostrare L'ultima riga allora chiama questo metodo delegato:

- (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]; 

} 

Questo codice sembra funzionare e fare una scansione all'incirca ogni 1 minuto, ma io non so esattamente il motivo per cui lavora ...

La documentazione sul core bluetooth è piuttosto scarso quindi se qualcuno ha qualche idea su come farlo, o ha un modo migliore per fare ciò che sto cercando di realizzare, apprezzerei l'aiuto!

+0

sembra funzionare ... Quanto spesso viene aggiornato il RSSI? EDIT: una volta al minuto?Penso che ci sia un timeout quando non ci si connette, in modo che ricomincia la scansione. – chwi

+0

Ho appena iniziato la lettura della documentazione me stesso, così sei più avanti di me domanda, perché stai chiamando scanForPeripheralsWithServices nei didRetrievePeripherals metodo delegato? Si chiama già dopo l'assegnazione di CBCentralManager. Questo potrebbe causare la scansione ripetitiva che hai menzionato. – mkr707

+0

solo i miei due centesimi per> = 7,0: retrievePeripheralsWithIdentifiers deve utilizzare da ora in poi. –

risposta

20

Hai provato a cambiare l'opzione di scansione su SÌ?

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

Se si esegue questa operazione si otterrà il callback "didDiscoverPeripheral" con ogni pacchetto di annunci che si vede dal vostro iPhone, che sarebbe normalmente circa ogni 100 ms (anche se vedo questa tempistica richiamata varia molto per lo stesso dispositivo). Questo include l'RSSI di ogni dispositivo che vede.

Questo dovrebbe essere molto più veloce della frequenza di aggiornamento di ~ 1 minuto.

+1

Qual è l'equivalente Swift per queste due linee? – Gerard

+0

@ Gerard: vedere la mia risposta qui sotto. – kbpontius

+1

Swift3: 'manager.scanForPeripherals (withServices: [sensorTagAdvertisingUUID], per mangiare: [CBCentralManagerScanOptionAllowDuplicatesKey: NSNumber (valore: true)])' – nablahero

3

Per quanto posso vedere, questo dovrebbe fare quello che vuoi.

Quando si avvia la scansione delle periferiche con la chiamata originale, il delegato dovrebbe iniziare a ricevere chiamate ogni volta che viene rilevato un dispositivo BLE. Questo continuerà finché non si interrompe la scansione con una chiamata a

[manager stopScan]; 

non credo che effettivamente bisogno la seconda chiamata a scanForPeripheralsWithServices nel centralManager: metodo didRetrievePeripherals, dal momento che, per quanto ne so, la scansione doesn non fermarti finché non lo dici a Comunque sto iniziando anch'io con questo, e potrebbe esserci un timeout che non ho ancora trovato.

Sono quasi sicuro che il motivo per cui ricevi una chiamata circa una volta al minuto è perché il dispositivo BLE fa pubblicità solo così spesso. Se pubblicizza più spesso, come un dispositivo in modalità di rilevamento, penso che riceverai le chiamate più spesso. Sarei interessante se potessi confermarlo. Se il dispositivo ha una modalità di rilevamento, potresti provare ad attivarlo per vedere se le notifiche accelerano.

2

Non si dovrebbe eseguire la scansione continua poiché è molto costoso per l'alimentazione. Una volta che hai scoperto i dispositivi, hai a disposizione una serie di oggetti CBPeripheral. Su CBPeripheral puoi leggere RSSI e ottenere una richiamata quando cambia RSSI. Vedere la seguente documentazione: http://developer.apple.com/library/mac/#documentation/CoreBluetooth/Reference/CBPeripheralDelegate_Protocol/translated_content/CBPeripheralDelegate.html

+0

'- [readRSSI]' richiede la connessione della periferica? –

+2

@ BenMosher si. – luxcem

1

rapida attuazione di una soluzione @Anders:

manager.scanForPeripheralsWithServices(nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey : NSNumber(bool: true)]) 
Problemi correlati