7

Le specifiche Bluetooth a bassa energia non dicono molto se le periferiche possono collegarsi a più di un centrale alla volta, ma il mio test di esperienza mi dice che non possono.Scansione continua per iOS CentralBluetooth Central Manager?

Poiché la mia applicazione richiede una relazione non possessiva con le periferiche (ovvero nessuna connessione, che bloccherebbe altre) e ha bisogno di aggiornare costantemente i valori RSSI, sto cercando un modo per scansionare continuamente le periferiche e acquisire i loro valori RSSI .

Il metodo scanForPeripheralsWithServices sembra eseguire la scansione per un determinato intervallo e quindi si interrompe. Credo che la mia migliore scommessa sia quella di scansionare per 3 secondi alla volta, fermare Scan, attendere (alcuni secondi) e quindi riavviare una scansione. Ripetere.

Qualcuno può indicare un modo migliore di farlo? Ad esempio, configurando una periferica per connettersi a più di una Centrale?

risposta

7

Una periferica non può collegarsi a più di una centrale. Ma se hai solo bisogno di catturare l'RSSI allora non hai nemmeno bisogno di collegarti. La scansione per i dispositivi in ​​grado di recuperare l'RSSI di utilizzare questa funzione:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 
+2

Sì, ma ho bisogno di ottenere costantemente una versione aggiornata RSSI. Le mie scoperte sono che una volta che Central Manager ha scoperto e riscoperto una periferica alcune volte, quindi smette di scoprirlo (sembra essere di circa 3 secondi) anche quando la scansione continua. Quello che mi rimane è che è necessario riavviare ripetutamente la scansione per cercare di ottenere i valori aggiornati di RSSI. – Jonathan

+3

Sì, è possibile riavviare la scansione all'interno della funzione didDiscoverPeripheral, e con ciò otterrete rapidamente l'RSSI per sempre. – Aboelseoud

+1

Grazie. Che funzioni. Al fine di risparmiare energia, in realtà smetto di scansionare dopo 100ms e poi faccio un burst di 100ms ogni secondo circa. Funziona alla grande. – Jonathan

5

Per quanto riguarda la risposta precedente, se siete interessati solo a RSSI si può semplicemente lo fanno in metodo delegato:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 

BTW, per impostazione predefinita, lo CBCentralManager chiamerà questo metodo solo una volta. Se avete bisogno di questo callback per essere chiamato ogni volta che il CBCentralManager riceve un annuncio di pacchetto è necessario per avviare la scansione con l'opzione CBCentralManagerScanOptionAllowDuplicatesKey insieme a YES:

NSDictionary *scanningOptions = @{CBCentralManagerScanOptionAllowDuplicatesKey: @YES}; 
[centralManager scanForPeripheralsWithServices:nil options:scanningOptions]; 

Attenzione che Apple scoraggiare l'utilizzo di questa opzione se non strettamente necessario .

Vedi: iOS Developer Library -Best Practices for Interacting with a Remote Peripheral Device

1

Ho risolto questo tipo di problema con questo codice, fondamentalmente solo riavviando la scansione ogni volta che un annuncio viene elaborato. Stavo affrontando lo stesso problema in cui l'istanza di CBCentralManager avrebbe smesso di ascoltare una periferica.

(. Impostazione CBCentralManagerScanOptionAllowDuplicatesKey-@YES non ha risolto completamente il problema per me)

Supponendo che la classe implementa CBCentralManagerDelegate:

- (id) init { 
    self.central = [[CBCentralManager alloc]initWithDelegate:self queue:nil]; 
    [self initScan]; 
} 

- (void) initScan { 
    [self.central stopScan]; 
    [self.central scanForPeripheralsWithServices:nil 
             options:[NSDictionary dictionaryWithObjectsAndKeys:@NO, CBCentralManagerScanOptionAllowDuplicatesKey, nil]]; 
} 

- (void) centralManager:(CBCentralManager*)central didDiscoverPeripheral:(CBPeripheral*)peripheral advertisementData:(NSDictionary*)advertisementData RSSI:(NSNumber*)RSSI { 

    // 
    // Do stuff here 
    // 

    [self initScan]; 
} 
Problemi correlati