¿Puedo medir la potencia de la señal de Bluetooth en iOS?

Me preguntaba si puedo medir la potencia de la señal de los dispositivos Bluetooth dentro del scope de mi iPhone. Básicamente lo que quiero hacer es search una list de dispositivos dentro del scope, y luego ver cuál tiene la mayor potencia de la señal. ¿Es posible en iOS y cómo lo haré si es así?

Sí, hay una manera de medir la intensidad de la señal para Bluetooth Low Energy (4.0), es el número RSSI. Cuando escanee para periféricos, establecerá la bandera CBCentralManagerScanOptionAllowDuplicatesKey en YES como se muestra a continuación:

NSDictionary * dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@YES, CBCentralManagerScanOptionAllowDuplicatesKey, nil]; // Start scanning for peripherals [cmanager scanForPeripheralsWithServices:nil options:dictionary]; 

Si desea ver el número de RSSI sin escribir ningún código, debe consultar la aplicación LightBlue en iTunes. Cuando se conecta a un periférico, le mostrará el número RSSI actualizado cada segundo cuando está conectado.

Eche un vistazo a la documentation CoreBluetooth :

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

RSSI es lo que buscas. Descargo de responsabilidad: Core Bluetooth está hecho para Bluetooth 4 LE solamente.

Si el scope exacto no importa, pero le interesan los dispositivos de escaneo que están disponibles en general, puede echar un vistazo al proyecto gTub BeeTee , que le permite escanear todos los dispositivos Bluetooth a su alnetworkingedor (no solo Bluetooth LE). De nuevo disclaimer: Soy el autor de BeeTee. D

Cuando codifique su código "central" con CBCentralManager, eventualmente se conectará al CBPeripheral que está buscando. Una vez que esté conectado al periférico, mantenga una reference, establezca su object como delegado del periférico e invoque ' readRSSI ' en el periférico. Obtendrá un periférico de callback de delegado : didReadRSSI: error: si escribe un método que invoca 'readRSSI', puede invocarlo utilizando performSelector: withObject: afterDelay:.

Otra de las respuestas sugeridas a esta pregunta es proporcionar la key 'permitir duplicates' al escanear. La documentation de la key del dictionary CBCentralManagerScanOptionAllowDuplicatesKey cuando se pasa a scanForPeripheralsWithServices: options: indica que "Inhabilitar este filtrado puede tener un efecto adverso en la duración de la batería y solo se debe usar si es necesario".

Si elige escribir una invocación retardada, puede ajustar la frecuencia de las llamadas para ayudarlo a gestionar el impacto en las baterías de sus usuarios.