2015-06-10 13 views
8

Mi piacerebbe avere un elenco di dispositivi ble a cui il mio iOS può connettersi, che si aggiorna quando appaiono e scompaiono i dispositivi.Come rilevare con CoreBluetooth quando una periferica scompare?

Per fare questo, ha creato un NSMutableDictionnary* peripheralsAvailable, e ogni - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI; viene chiamato dal CBCentralManager, aggiungo periferica alla Dictionnary peripheralsAvailable (e quindi aggiornare un UITableView). Tutto va bene qui.

Tuttavia non riesco a trovare il modo in cui posso aggiornare il dizionario se una Periferica "scompare". Sembra che io possa aggiungere solo periferiche nel mio dictionnary quando vengono rilevate, ma non posso rimuoverne uno quando lo chiudo, ad esempio.

Potrebbe dirmi se mi manca qualcosa?

risposta

4

Il sistema operativo eseguirà il rilevamento nella cache dei dispositivi. Cioè riceverai solo un evento di "scoperta" per dispositivo.

Per ottenere risultati in modo continuo gli eventi di scoperta mentre la periferica è la pubblicità, è necessario utilizzare la seguente opzione:

CBCentralManagerScanOptionAllowDuplicatesKey

Un valore booleano che specifica se la scansione deve essere eseguito senza filtraggio duplicato.

Il valore per questa chiave è un oggetto NSNumber. Se SÌ, il filtro è disabilitato e viene generato un evento di rilevamento ogni volta che lo centrale riceve un pacchetto pubblicitario dalla periferica. La disattivazione del filtro può avere un effetto negativo sulla durata della batteria e deve essere utilizzato solo se necessario. Se NO, più scoperte della stessa periferica vengono raggruppate in un singolo evento di rilevamento. Se la chiave è non specificata, il valore predefinito è NO.

Impostare l'opzione di cui sopra per YES, si potrebbe tenere traccia di tutte le periferiche che sono la pubblicità e quando si ferma la pubblicità, si potrebbe rimuoverlo dalla lista.

Per un dispositivo a cui ci si è connessi, c'è l'evento delegato didDisconnectPeripheral.


I dispositivi Bluetooth non annunciano che stanno per andare via, né fanno pubblicità che stai per andare fuori portata. Ottieni una pubblicità mentre fanno pubblicità e sei a portata di mano e non ricevi nulla quando sei fuori portata o smette di fare pubblicità. Non c'è nessun evento da attivare quando se ne sono andati. Devi ricordare i dispositivi che pubblicizzano e quando interrompono la pubblicità (non hai ricevuto un annuncio per un po '), puoi rimuoverlo dall'elenco.

+1

Grazie! Sapevo che esisteva DisconnectPeripheral, ma dovevo connettermi per usarlo.Non sapevo di CBCentralManagerScanOptionAllowDuplicatesKey, ed è esattamente ciò di cui avevo bisogno. – darksider

+0

Come farlo se sei in sottofondo? In tal caso, CBCentralManagerScanOptionAllowDuplicatesKey verrà ignorato. – kukudas

+1

@kukudas, la tua periferica BLE potrebbe pubblicizzare con un diverso indirizzo del dispositivo a intervalli regolari in modo che il client la vedrà come una diversa periferica mentre è in background, ma ha l'ID effettivo nel pacchetto pubblicitario, in modo che il client sappia che è davvero la stessa periferica. –

0

Grande risposta di Marcus. Una nota aggiuntiva da aggiungere è che l'opzione di scansione CBCentralManagerScanOptionAllowDuplicatesKey come sopra menzionato non funziona in background.

Le app che hanno specificato la modalità sfondo bluetooth-centrale possono scansionare mentre sono in background. Detto questo, devono eseguire una ricerca esplicita di uno o più servizi specificandoli nel parametro serviceUUIDs. L'opzione di scansione di CBCentralManager viene ignorata durante la scansione in background.

Problemi correlati