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. p>
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. p>
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. p>
Quelqu'un peut-il indiquer une meilleure façon de le faire? Par exemple, configurez un périphérique pour se connecter à plusieurs centraux? P>
3 Réponses :
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
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?
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é: BTW, par défaut, le attention à ce que Apple décourage l'utilisation de cette option si elle n'est pas strictement nécessaire. p> Voir: Pratiques de la bibliothèque de développeurs iOS pour interagir avec un dispositif périphérique distant p> p> cbcentralManager code> ne fera appeler cette méthode une fois. Si vous avez besoin de ce rappel à appeler à chaque fois que le
CBCentralManager CODE> reçoit un paquet de publicité, vous devez initier la numérisation avec l'option
cbcentralmanagerscanoptionallowduplicateskey code> défini sur
oui code> : p>
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 supposer que la classe implémente CBCLRALManagerDelegate: P> cbentralmanagerscanoptionallowduplicateskey code> à
@yes code> n'a pas complètement résolu le problème pour moi.)
- (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];
}
Cela marche. J'ai fini par mettre un retard pour accélérer la fréquence de balayage.