51 votes

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

Je suis en train de créer une application iPhone (Xcode 4.3.1, IOS 5) que l'on pourrait utiliser des périphériques Bluetooth! Le but principal de cette application est couverte de navigation (GPS à l'intérieur des bâtiments n'est pas vraiment précis).

La seule solution que je vois ici (pour garder mon application sur l'AppStore) est d'essayer d'analyse pour les appareils bluetooth disponibles!

J'ai essayé d'utiliser CoreBluetooth cadre, mais je ne suis pas d'obtenir 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 au sujet de cette ligne, comment passer des paramètres corrects?

[mgr scanForPeripheralsWithServices:nil options:nil];

J'ai pris un coup d'oeil dans la pomme de référence .. et je ne comprends toujours pas qu'est-ce que CBUUID ??? Chaque appareil a bluetooth id? où puis-je le trouver?

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

Paramètres serviceUUIDs - Un tableau de CBUUIDs l'application est intéressé. options - Un dictionnaire de personnaliser l'analyse, voir CBCentralManagerScanOptionAllowDuplicateskey.

Est-il un autre moyen pour utiliser le Bluetooth sur IOS? Je veux dire, les anciens cadres qui n'utilisent pas de BLE 4.0!

tout conseil serait apprécié!

merci!

23voto

Wilhelmsen Points 1191

Ce guide a l'air prometteur pour le Bluetooth 3.0. Rappelez-vous que le CoreBluetooth cadre est UNIQUEMENT pour Bluetooth Low Energy (4.0). Au bluetooth.org's dev-pages , vous pouvez voir quelques exemples de globalement défini services, et Guan Yang mentionen, vous pouvez voir que le cœur de taux de service est 0x180D. L'UUID de l'unité est définie par le fabricant.

Voici un extrait de code pour peut-être vous aider le long du chemin.

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

15voto

viktorvogh Points 71

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

Par exemple, une fréquence cardiaque Bluetooth Capteur qui offre le service "fréquence cardiaque", publie un service avec l'UUID de la 0x180D.

(plus de services ici: http://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx)

Ainsi, lorsque vous effectuez une recherche, vous devez fournir un UUID que les critères, à propos de service de recherche.

J'espère que cela aide :)

10voto

Guan Yang Points 594

Vous devriez jeter un oeil à l'un des exemples. Voici la ligne:

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

(Je sais que c'est un exemple sous Mac OS X, mais l'iOS CoreBluetooth API est très similaire.)

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

La plupart des appareils de mettre en œuvre le dispositif de service d'information, donc si vous êtes simplement à la recherche pour n'importe quel appareil, vous pouvez essayer de l' [CBUUID UUIDWithString:@"180A"].

3voto

Jes Points 50

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

0voto

l0gg3r Points 3366

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

Tout ce que vous devez faire

 
    [[LGCentralManager sharedInstance] scanForPeripheralsByInterval: 4
                                                         achèvement: ^ (périphériques NSArray *) {
     }];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X