2012-10-23 10 views
6

Je me demandais si je pouvais mesurer la puissance du signal des appareils Bluetooth à portée de mon iPhone. Fondamentalement, ce que je veux faire est de scanner une liste de périphériques à portée, puis de voir lequel a la puissance de signal la plus élevée. Est-ce possible sur iOS et comment le ferais-je?Puis-je mesurer la force du signal Bluetooth dans iOS?

Répondre

5

Oui, il existe un moyen de mesurer la force du signal pour Bluetooth Low Energy (4.0) c'est le numéro RSSI. Lors de la numérisation pour les périphériques que vous mettrez le CBCentralManagerScanOptionAllowDuplicatesKey drapeau YES comme indiqué ci-dessous:

NSDictionary * dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@YES, CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 

// Start scanning for peripherals 
[cmanager scanForPeripheralsWithServices:nil options:dictionary]; 

Si vous voulez voir le travail numéro RSSI sans écrire de code que vous devriez vérifier l'application LightBlue dans iTunes. Lorsque vous vous connectez à un périphérique, il affiche le numéro RSSI mis à jour toutes les secondes lorsqu'il est connecté.

2

Jetez un oeil à la CoreBluetooth documentation:

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

RSSI est ce que vous recherchez. Disclaimer: Core Bluetooth est fait pour Bluetooth 4 LE seulement.

Si la plage exacte n'a pas d'importance, mais vous êtes intéressés par des dispositifs de balayage qui sont disponibles en général, vous pouvez jeter un oeil au projet github BeeTee, qui vous permet de numériser tous les périphériques Bluetooth autour de vous (non seulement Bluetooth LE). Encore une fois, je suis l'auteur de BeeTee. ;-)

0

Lorsque vous codez votre code "central" à l'aide de CBCentralManager, vous vous connecterez éventuellement au CBPeripheral que vous recherchez. Une fois que vous êtes connecté au périphérique, gardez une référence, définissez votre objet en tant que délégué du périphérique et appelez 'readRSSI' sur le périphérique. Vous obtiendrez un rappel de délégué peripheral: didReadRSSI: error: Si vous écrivez une méthode qui appelle 'readRSSI', vous pouvez l'appeler en utilisant performSelector: withObject: afterDelay:.

Une autre des réponses suggérées à cette question est de fournir la clé «autoriser les doublons» lors de la numérisation. Les docs pour la clé de dictionnaire CBCentralManagerScanOptionAllowDuplicatesKey lorsqu'il est passé à scanForPeripheralsWithServices:options: indiquent que "La désactivation de ce filtrage peut avoir un effet négatif sur la durée de vie de la batterie et ne doit être utilisée que si nécessaire".

Si vous choisissez d'écrire une invocation différée, vous pouvez régler la fréquence des appels pour vous aider à gérer l'impact sur les batteries de vos utilisateurs.

Questions connexes