2015-04-18 12 views
6

Sto vedendo un bug strano in iOS 8.3 e mi chiedo se qualcun altro stia vedendo la stessa cosa.Core Bluetooth: CBPeripheral disconnette ogni ~ 10 secondi

Ho un iPad Air (in modalità Centrale) e un iPhone 6 (in modalità Periferica) molto vicino.

  • mio CBCentralManager viene inizializzato con una coda di sfondo di serie e la possibilità CBCentralManagerOptionRestoreIdentifierKey
  • Il manager inizia la scansione per le periferiche che utilizzano il CBCentralManagerScanOptionAllowDuplicatesKey: true opzione
  • Entro centralManager:didDiscoverPeripheral: verifico con un elenco di periferiche che sono già scoperto:
let connect:() ->() = { 
    peripheral.delegate = self 
    self.devices[peripheral.identifier.UUIDString] = peripheral 
    self.manager.connectPeripheral(peripheral, options: nil) 
} 

if let device = devices[peripheral.identifier.UUIDString] { 
    if device.peripheral.state == .Disconnected { 
    connect() 
    } 
} else if peripheral.state == .Disconnected { 
    connect() 
} 
  • Una volta connesso, scopro servizi e caratteristiche.

La periferica ora si disconnette dopo circa 10 secondi, viene immediatamente rilevata di nuovo e si ricollega. 10 secondi dopo questa procedura si ripete.

È un errore o sto facendo qualcosa di sbagliato qui?

Ho anche provato ad iscrivermi direttamente a una caratteristica sulla periferica, ma questo non sembrava cambiare nulla.

+1

ho usato la mia prova app su un dispositivo iOS8.3 e io non vedo questo - entrambi con un Fitbit Flex periferica e un altro dispositivo iOS come una periferica. C'è una ragione particolare per cui stai impostando la chiave Consenti duplicati? Normalmente non è necessario e scarica la batteria. Non ho problemi a mantenere la connessione a una periferica BLE per ore. – Paulw11

+0

Grazie Paul, sto usando la chiave duplicati per eseguire azioni basate sul RSSI. Ti connetti alla periferica una volta? Quali caratteristiche leggi/scrivi/sottoscrivi? La periferica aggiorna continuamente i valori? Penso che potrebbe avere qualcosa a che fare con quello? – desktop

+0

Mi collego alla periferica una volta. Se si desidera ottenere il valore RSSI della periferica connessa, è possibile utilizzare il metodo 'readRSSI' CBPeripheral. Il mio codice di esempio non legge/scrive continuamente o notifica su nessuna caratteristica – Paulw11

risposta

7

È un comportamento previsto. Il Bluetooth è stato progettato per consumare pochissima energia in modo che la connessione venga interrotta il prima possibile. Inoltre, almeno in iOS 7 non era necessario riscoprire il dispositivo periferico: era possibile riconnettersi al dispositivo già scoperto dopo la disconnessione. Sono abbastanza sicuro che è vero anche per iOS 8. Il metodo consigliato di lavorare con BLE, se non hai bisogno di una connessione permanente è:

  1. Scopri
  2. Collegare
  3. lettura/scrivere tutto ciò che serve come presto possibile
  4. timer Setup
  5. quando il timer incendi passare al punto 2

Se avete bisogno di una connessione permanente (ad esempio è necessario prendere Abo Data frequenza cardiaca ut in tempo reale) è possibile iscriversi per la caratteristica con - setNotifyValue:forCharacteristic:

When you enable notifications for characteristic’s value, the peripheral calls the peripheral:didUpdateNotificationStateForCharacteristic:error: method of its delegate object to notify your app when the characteristic’s value changes. Because it is the peripheral that chooses when to send an update, your app should be prepared to handle them as long as notifications or indications remain enabled.

+0

Grazie, ho provato ad iscrivermi alla caratteristica di notifica di una periferica dopo la connessione, ma la connessione è caduta comunque. Sai se la caratteristica di notifica in realtà ha bisogno di emettere dati in modo che i due dispositivi rimangano connessi? – desktop

+0

@desktop Sì, dovrebbe emettere alcuni dati ma non so con quale frequenza. Probabilmente è descritto da qualche parte all'interno della specifica BLE https://www.bluetooth.org/en-us/specification/adopted-specifications – Avt