¿Cómo obtener la lista de dispositivos Bluetooth disponibles?

¡Actualmente estoy creando una aplicación para iPhone (Xcode 4.3.1, IOS 5) que podría usar dispositivos Bluetooth! El objective principal de esta aplicación es la navegación interior (el GPS dentro de los edificios no es realmente preciso).

La única solución que veo aquí (para mantener mi aplicación en AppStore) es intentar escanear en busca de dispositivos Bluetooth disponibles.

Intenté usar el framework CoreBluetooth, ¡pero no consigo la lista de dispositivos disponibles! Tal vez no uso estas funciones correctamente

#import  #import  @interface AboutBhyperView : UIViewController  { CBCentralManager *mgr; } @property (readwrite, nonatomic) CBCentralManager *mgr; @end - (void)viewDidLoad { [super viewDidLoad]; mgr = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; } - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { NSLog([NSString stringWithFormat:@"%@",[advertisementData description]]); } -(void)centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *)peripherals{ NSLog(@"This is it!"); } - (void)centralManagerDidUpdateState:(CBCentralManager *)central{ NSString *messtoshow; switch (central.state) { case CBCentralManagerStateUnknown: { messtoshow=[NSString stringWithFormat:@"State unknown, update imminent."]; break; } case CBCentralManagerStateResetting: { messtoshow=[NSString stringWithFormat:@"The connection with the system service was momentarily lost, update imminent."]; break; } case CBCentralManagerStateUnsupported: { messtoshow=[NSString stringWithFormat:@"The platform doesn't support Bluetooth Low Energy"]; break; } case CBCentralManagerStateUnauthorized: { messtoshow=[NSString stringWithFormat:@"The app is not authorized to use Bluetooth Low Energy"]; break; } case CBCentralManagerStatePoweredOff: { messtoshow=[NSString stringWithFormat:@"Bluetooth is currently powered off."]; break; } case CBCentralManagerStatePoweredOn: { messtoshow=[NSString stringWithFormat:@"Bluetooth is currently powered on and available to use."]; [mgr scanForPeripheralsWithServices:nil options:nil]; //[mgr retrieveConnectedPeripherals]; //--- it works, I Do get in this area! break; } } NSLog(messtoshow); } 

No estoy seguro acerca de esta línea, ¿cómo pasar los parámetros correctos?

 [mgr scanForPeripheralsWithServices:nil options:nil]; 

Eché un vistazo a la referencia de Apple … y todavía no entiendo qué es eso CBUUID ??? ¿Cada dispositivo tiene alguna identificación de bluetooth? ¿Dónde puedo encontrarlo?

 - (void)scanForPeripheralsWithServices:(NSArray *)serviceUUIDs options:(NSDictionary *)options; 

Parámetros serviceUUIDs: una matriz de CBUUID en los que la aplicación está interesada. Options: un diccionario para personalizar el escaneo, consulte CBCentralManagerScanOptionAllowDuplicatesKey.

¿Hay alguna otra forma de usar Bluetooth en IOS? Quiero decir, marcos anteriores que no usan BLE 4.0.

cualquier consejo sería apreciado!

¡Gracias!

Esta guía parece prometedora para Bluetooth 3.0. Recuerde que el marco CoreBluetooth SÓLO es para Bluetooth Low Energy (4.0). En las páginas de desarrollo de bluetooth.org puede ver algunos ejemplos de servicios definidos globalmente, y como mencionó Guan Yang, puede ver que el servicio de frecuencia cardíaca es 0x180D. El UUID de la unidad está definido por el fabricante.

Aquí hay un fragmento de código que quizás te ayude en el camino.

 // Initialize a private variable with the heart rate service UUID CBUUID *heartRate = [CBUUID UUIDWithString:@"180D"]; // Create a dictionary for passing down to the scan with service method NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:CBCentralManagerScanOptionAllowDuplicatesKey]; // Tell the central manager (cm) to scan for the heart rate service [cm scanForPeripheralsWithServices:[NSArray arrayWithObject:heartRate] options:scanOptions] 

en Bluetooth, hay “Servicios”. Un dispositivo publica servicios 1..N , y cada servicio tiene características 1..M . Cada servicio tiene un identificador único, llamado UUID .

Por ejemplo, un sensor Bluetooth de frecuencia cardíaca que ofrece el servicio “frecuencia cardíaca”, publica un servicio con UUID 0x180D .

(más servicios aquí )

Por lo tanto, cuando realiza una búsqueda, debe proporcionar un UUID como criterio, indicando qué servicio buscar.

Deberías echarle un vistazo a uno de los ejemplos . Aquí está la línea relevante:

 [manager scanForPeripheralsWithServices:[NSArray arrayWithObject:[CBUUID UUIDWithString:@"180D"]] options:nil]; 

(Sé que este es un ejemplo de Mac OS X, pero la API iOS CoreBluetooth es muy similar).

CBUUID identifica los servicios que le interesan, no los dispositivos. Los servicios estándar tienen un UUID de 16 bits, en este caso 0x180d para el monitor de frecuencia cardíaca o quizás 0x180a para información del dispositivo, mientras que los servicios propietarios tienen un UUID de 128 bits (16 bytes).

La mayoría de los dispositivos implementan el servicio de información del dispositivo, por lo que si solo está buscando un dispositivo, puede probar [CBUUID UUIDWithString:@"180A"] .

Intente dar esto mientras escanea dispositivos

 NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; [self.centralManager scanForPeripheralsWithServices:nil options:options]; 

usted podrá obtener la lista de dispositivos en el método de delegado didDiscoverPeripheral

Mantenga la calma y use https://github.com/l0gg3r/LGBluetooth

Todo lo que necesitas hacer

 [[LGCentralManager sharedInstance] scanForPeripheralsByInterval:4 completion:^(NSArray *peripherals) { }];