10

Sto usando Bluetooth LE su iPhone 5S e ho fatto quanto segue:Bluetooth LE, scanForPeripheralsWithServices in background, aumentare la velocità

  • Ho una periferica Bluetooth e ho configurato per pubblicizzare ogni 20 ° ms su tutti e tre i canali pubblicitari bluetooth (37, 38 e 39).

  • Ho configurato il mio app con UIBacgroundModes = bluetooth nel centro-Info.plist

  • ho iniziato uno scanForPeripheralsWithServices come qui di seguito

Codice:

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

L'attuale stato è:

  • In modalità primo piano l'applicazione riceve rapidamente messaggi pubblicitari quando inizio la mia periferica (entro un secondo)

  • in background l'applicazione a volte riceve messaggi pubblicitari all'interno come 10 secondi dopo l'inizio della periferica (che può essere accettabile anche se è male) ma spesso non riceve la pubblicità per un tempo molto lungo (minuti o più) e questo non funziona per l'applicazione.

domanda è:

E 'in qualche modo possibile aumentare la velocità di cui iOS è la scansione per il Bluetooth 4.0 LE periferiche quando l'applicazione di scansione è in background? Dal momento che non penso che ci sia un'API pubblica per farlo, sto cercando un'API privata che non sia pubblicata da Apple. Questo è per un'app aziendale interna, quindi un'API privata sarebbe perfettamente OK.

+0

@jesnolsson Come trovare CBUUID all'avvio dell'app? voglio farlo nel mio progetto. –

+0

Probabilmente dovresti scrivere una nuova domanda su SO .. Ma per iniziare devi solo seguire il mio codice qui sopra. L'UUID effettivo dei Servizi è specifico per il tipo di accessorio Bluetooth LE che hai, quindi devi guardare i numeri attuali. Vorrei raccomandare LightBlue disponibile su App Store per questo scopo. –

risposta

5

modalità Sfondo funziona in modo diverso per la scansione.

  • Ogni periferica è riportata solo la prima volta singola si osserva (non è possibile tenere traccia di prossimità attraverso RSSI senza collegarlo ad esso in modalità background).

  • è possibile avviare una richiesta di connessione ad una periferica che non è nel raggio d'azione, e la connessione completerà quando la periferica diventa disponibile. Non è necessario scansionarlo attivamente (tranne che per la scoperta iniziale, in modo da sapere quale UUID si connette).

Forse, è possibile risolvere il problema inviando una richiesta di connessione invece di scansione, mentre in background. In questo modo, iOS sa che sei veramente interessato a una specifica periferica e immagino che ciò influenzi i tempi di scoperta.

A seconda del vostro obiettivo, un approccio diverso potrebbe essere quello di invertire il collegamento posizionando l'iPhone in modalità periferica e utilizzare le periferiche LE corrente in modalità centrale. Sembra hackish, ma se risolve il problema per il tuo caso: perché no :)

Per quanto riguarda un'API privata: mi dispiace, non ne conosco uno che influisce sui parametri di scansione.

+1

Grazie per la risposta, è molto interessante, se faccio la periferica iPhone e l'accessorio in modalità centrale, quanto spesso si pubblicizzerà l'iPhone? la pubblicità funzionerà bene in background o subirà la stessa bassa velocità della pubblicità come con la scansione? Connect non è veramente adatto allo scopo poiché desidero ottenere informazioni da più periferiche. Forse questo è un problema anche se l'iPhone è una periferica poiché solo una centrale può comunicare con essa? –

+1

L'intervallo di pubblicità dell'iPhone dipende dalla frequenza con cui è stato avviato (diventa più lento nel tempo) e se l'app è in background. Dovrebbe funzionare in background (serve un'altra chiave in background in Info.plist), non è sicuro delle latenze di connessione (tuttavia, puoi misurare con uno sniffer di pacchetti Bluetooth - nota che devi scansionare tutti e 3 i canali pubblicitari, dato che l'iPHone non può essere configurato per utilizzare solo uno). La modalità periferica di iPhone non è conforme agli standard e consente di connettere più centrali. – Etan

+0

@Etan, per quanto riguarda il primo punto della risposta. CBCentralManager può ascoltare (e NSLog) su centralManager: didDiscoverPeripheral: advertisement Dati: RSSI :, anche mentre la periferica è in background, ottengo l'RSSI. Ti stai riferendo a readRSSI? Come è diverso? Grazie – Spectravideo328

Problemi correlati