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.
Volevo solo dire che ho lo stesso identico problema con la connessione non è scaduta. Sai se è un bug? –
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. –
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 :) –