2014-09-17 21 views
10

Sto progettando un framework iOS per gestire più dispositivi BLE (tutti dello stesso tipo). Al momento funziona tutto molto bene, tranne una cosa:CoreBluetooth: rilevamento dispositivo fuori intervallo/timeout connessione

Il client desidera un elenco con i dispositivi disponibili. Ma come posso rilevare quando un dispositivo, che è stato scoperto in passato, non è più disponibile?

Un altro problema si verifica quando si tenta di connettersi a un dispositivo che non è più disponibile. La documentazione dice: I tentativi di connessione non scadono mai e

E sì, non ho mai ricevuto un errore tramite didFailToConnectPeripheral.

Ho fatto qualche ricerca ma non sono riuscito a capire come gestire correttamente questi problemi tramite CoreBluetooth. Così ho sviluppato le mie soluzioni, ma non sono sicuro che sia il modo giusto (o almeno un buon modo, perché ci possono essere diversi modi per farlo).

1. Rilevamento dispositivi che non sono più disponibili

scruto con

[_centralManager scanForPeripheralsWithServices:services options:@{CBCentralManagerScanOptionAllowDuplicatesKey: @(TRUE)}]; 

quindi ricevere annunci tutto il tempo fino a quando il dispositivo non è collegato. Controllo con un timer che l'annuncio si ripresenta in un dato intervallo di tempo (abbastanza grande, corrispondente all'intervallo di annunci del dispositivo). Se l'annuncio non si verifica nell'intervallo, rimuovo il dispositivo dall'elenco.

2. Rilevamento del timeout della connessione Beh, questo è piuttosto facile, credo. Uso la mia funzione di timeout e annullo la richiesta di connessione se il timer scade.

Se qualcuno avesse mai incontrato questo problema, sarei molto interessato alla sua opinione e/o alla sua soluzione, naturalmente.

UPDATE 2014/12/17:

Nel frattempo ho lavorato per conto mio soluzione utilizzando i timer e sembra funzionare abbastanza bene.

Il timeout della connessione è semplice. Basta impostare un timer su 5 secondi o qualsiasi cosa tu pensi che sia giusto per te. Se il timer scade e il dispositivo non si connette, è sufficiente annullare la connessione e comunicare all'utente che si è verificato un problema.

Rilevare dispositivi fuori dall'intervallo è stato un po 'più complicato. Per ogni dispositivo rilevato, avvio un timer che scatta dopo il doppio del tempo, il dispositivo invia annunci pubblicitari. Se il dispositivo invia un altro annuncio fino alla scadenza del timer, probabilmente è andato fuori portata o è stato spento o collegato a un altro dispositivo.

Non voglio rispondere alla mia stessa domanda perché spero che forse un giorno Apple si prenderà cura di questi problemi.

+0

Volevo solo dire che ho lo stesso identico problema con la connessione non è scaduta. Sai se è un bug? –

+0

in realtà non sono più coinvolto nel progetto corrispondente da gennaio e quindi non ho informazioni aggiornate sull'argomento. Dal mio punto di vista non si trattava di un bug, ma di una funzionalità mancante. –

+0

Bene, nel protocollo BLE hanno un timeout impostato su 20 secondi. Sembrano automaticamente riprovare senza avvisare il delegato/fallire/darti la possibilità di rispondere quindi direi che è una grande caratteristica mancante :) –

risposta

4

Il modo corretto per determinare se un dispositivo è disponibile è quello di memorizzare il valore della periferica identifier. Prima di provare a riconnettersi, chiama retrievePeripheralsWithIdentifiers. Tuttavia, questo non garantisce ancora che il dispositivo sarà nel raggio d'azione dal momento in cui tenterai di connetterti!

I tentativi di connessione non scadono a livello di sistema operativo e questo è esplicitamente documented.

Alcune applicazioni potrebbero aver bisogno di utilizzare il framework Nucleo Bluetooth per eseguire azioni a lungo termine sullo sfondo. Ad esempio, immagina di essere sviluppando un'app di sicurezza domestica per un dispositivo iOS che comunica con una serratura (dotata di tecnologia Bluetooth a basso consumo energetico). L'app e il blocco interagiscono per bloccare automaticamente la porta quando l'utente esce di casa e sblocca la porta quando l'utente ritorna, mentre l'app è in background. Quando l'utente esce di casa, il dispositivo iOS potrebbe eventualmente non rientrare nell'intervallo del blocco, causando la perdita della connessione . A questo punto, l'app può semplicemente chiamare il connectPeripheral: opzioni: metodo della classe CBCentralManager e poiché le richieste di connessione non scadono, il dispositivo iOS si riconnetterà a quando l'utente torna a casa.

Problemi correlati