10
votes

Numérisation continue pour iOS CoreBluetooth Central Manager?

La spécification Bluetooth Bluetooth à basse énergie ne dit pas grand chose de savoir si les périphériques peuvent se connecter à plusieurs centraux à la fois, mais mes tests d'expérience me disent qu'ils ne le peuvent pas.

Parce que ma demande nécessite une relation non possessive avec les périphériques (c'est-à-dire aucune connexion, qui bloquerait les autres) et doit mettre à jour constamment leurs valeurs RSSI, je recherche un moyen de numériser continuellement pour les périphériques et de capturer leurs valeurs RSSI.

La méthode ScanForPeriphériquesWithServices semble numériser pour un certain intervalle, puis s'arrête. Je pense que mon meilleur pari est de numériser pendant 3 secondes à la fois, d'arrêter, d'attendre (plusieurs secondes), puis de réinitialiser une analyse. Répéter.

Quelqu'un peut-il indiquer une meilleure façon de le faire? Par exemple, configurez un périphérique pour se connecter à plusieurs centraux?


0 commentaires

3 Réponses :


8
votes

Un périphérique ne peut pas se connecter à plusieurs centraux. Mais si vous devez simplement capturer le RSSI, vous n'avez même pas besoin de vous connecter. Le balayage des périphériques peut récupérer le RSSI à l'aide de cette fonction:

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


5 commentaires

Oui, mais j'ai besoin d'obtenir continuellement un RSSI mis à jour. Mes résultats sont que, une fois que Central Manager a découvert et a redécouvert un périphérique à quelques reprises, alors il cesse de la découvrir (semble être environ 3 secondes) même lorsque la balayage continue. Ce qui me reste peut-être de réinitialiser à nouveau la numérisation pour essayer de mettre à jour les valeurs RSSI.


Oui, vous pouvez réinitialiser la numérisation à l'intérieur de la fonction DidDiscoverperIphériques et vous obtiendrez rapidement le RSSI pour toujours.


Merci. Ça marche. Afin de conserver l'énergie, j'arrête réellement scanner après 100 ms, puis effectuez une rafale de 100 ms chaque seconde. Fonctionne très bien.


Pouvez-vous s'il vous plaît indiquer la documentation où un périphérique ne peut pas se connecter à plusieurs centraux? Dans CBCENTRALMANAGERDELEGEEGATE, il existe une fonction appelée - (vide) CentralManager: (CBCentralManager *) Central DidetRieveconnececePeriberals: (Nsarray *) Périphériques, où les périphériques sont un tableau.


Bonjour Jonathan, pouvez-vous s'il vous plaît poster votre code d'extraits pour faire cela?



5
votes

Quant à la réponse précédente, si vous n'êtes intéressé que dans RSSI, vous pouvez simplement l'obtenir dans la méthode du délégué: xxx

BTW, par défaut, le cbcentralManager ne fera appeler cette méthode une fois. Si vous avez besoin de ce rappel à appeler à chaque fois que le CBCentralManager reçoit un paquet de publicité, vous devez initier la numérisation avec l'option cbcentralmanagerscanoptionallowduplicateskey défini sur oui : xxx

attention à ce que Apple décourage l'utilisation de cette option si elle n'est pas strictement nécessaire.

Voir: Pratiques de la bibliothèque de développeurs iOS pour interagir avec un dispositif périphérique distant


0 commentaires

2
votes

J'ai résolu ce type de problème avec ce code, il suffit de redémarrer la numérisation à chaque fois qu'une publicité est traitée. Je faisais face au même problème que l'instance CBCentralManager arrêterait d'écouter un périphérique.

(paramètre cbentralmanagerscanoptionallowduplicateskey code> à @yes code> n'a pas complètement résolu le problème pour moi.)

supposer que la classe implémente CBCLRALManagerDelegate: P>

- (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];
}


1 commentaires

Cela marche. J'ai fini par mettre un retard pour accélérer la fréquence de balayage.