web-dev-qa-db-fra.com

Comment obtenir la liste des périphériques Bluetooth disponibles?

Je crée actuellement une application iPhone (Xcode 4.3.1, IOS 5) qui pourrait utiliser des périphériques Bluetooth! L'objectif principal de cette application est la navigation intérieure (le GPS à l'intérieur des bâtiments n'est pas vraiment précis).

La seule solution que je vois ici (pour conserver mon application sur l'AppStore) est d'essayer de rechercher les périphériques Bluetooth disponibles!

J'ai essayé d'utiliser le framework CoreBluetooth, mais je n'ai pas la liste des périphériques disponibles! Peut-être que je n'utilise pas ces fonctions correctement

#import <UIKit/UIKit.h>
#import <CoreBluetooth/CoreBluetooth.h>

@interface AboutBhyperView : UIViewController <CBPeripheralDelegate, CBCentralManagerDelegate>
{
    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); 
} 

Je ne suis pas sûr de cette ligne, comment passer les paramètres corrects?

[mgr scanForPeripheralsWithServices:nil options:nil];

J'ai jeté un coup d'oeil dans la référence Apple .. et je ne comprends toujours pas ce qu'est ce CBUUID ??? Chaque appareil a un identifiant Bluetooth? Où puis-je le trouver?

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

Paramètres ServiceUUIDs - Un tableau de CBUUID qui intéresse l’application. Options - Un dictionnaire pour personnaliser l’analyse, voir CBCentralManagerScanOptionAllowDuplicatesKey.

Existe-t-il un autre moyen d'utiliser Bluetooth sur IOS? Je veux dire, des frameworks plus anciens qui n'utilisent pas BLE 4.0!

tout avis sera le bienvenu!

merci!

48
mz87

Ce guide semble prometteur pour Bluetooth 3.0. N'oubliez pas que la structure CoreBluetooth concerne UNIQUEMENT Bluetooth Low Energy (4.0). Sur bluetooth.org - dev-pages vous pouvez voir quelques exemples de services définis globalement, et en tant que Guan Yang, vous pouvez voir que le service de fréquence cardiaque est 0x180D. Les UUID de l'unité sont définis par le fabricant. 

Voici un extrait de code qui vous aidera peut-être tout au long du processus. 

// 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]
21
chwi

en Bluetooth, il y a des "services". Un appareil publie des services 1..N et chaque service a les caractéristiques 1..M. Chaque service a un identifiant unique, appelé UUID.

Par exemple, un capteur Bluetooth de fréquence cardiaque qui offre le service "fréquence cardiaque", publie un service avec UUID 0x180D.

(plus de services ici )

Ainsi, lorsque vous effectuez une recherche, vous devez fournir un critère UUID indiquant quel service rechercher.

15
viktorvogh

Vous devriez jeter un oeil sur un des exemples . Voici la ligne pertinente:

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

(Je sais qu'il s'agit d'un exemple Mac OS X, mais l'API iOS CoreBluetooth est très similaire.)

CBUUID identifie les services qui vous intéressent, pas les appareils. Les services standard ont un UUID 16 bits, dans ce cas 0x180d pour le moniteur de fréquence cardiaque ou peut-être 0x180a pour les informations sur l'appareil, tandis que les services propriétaires ont un UUID 128 bits (16 octets).

La plupart des périphériques implémentent le service d'informations sur les périphériques. Par conséquent, si vous recherchez simplement un périphérique, vous pouvez essayer [CBUUID UUIDWithString:@"180A"].

10
Guan Yang

Essayez de donner ceci pendant que vous recherchez des périphériques 

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], CBCentralManagerScanOptionAllowDuplicatesKey, nil];

 [self.centralManager scanForPeripheralsWithServices:nil options:options];

vous pourrez obtenir la liste des périphériques à la méthode didDiscoverPeripheral delegate

3
Jes

Restez calme et utilisez https://github.com/l0gg3r/LGBluetooth

Tout ce que vous devez faire

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

0
l0gg3r