it-swarm.com.de

Wie bekomme ich eine Liste der verfügbaren Bluetooth-Geräte?

Ich erstelle gerade eine iPhone-App (Xcode 4.3.1, IOS 5), die Bluetooth-Geräte verwenden kann! Hauptziel dieser Anwendung ist die Navigation in Innenräumen (GPS in Gebäuden ist nicht wirklich genau).

Die einzige Lösung, die ich hier sehe (um meine App im AppStore zu behalten), ist der Scan nach verfügbaren Bluetooth-Geräten!

Ich habe versucht, das CoreBluetooth-Framework zu verwenden, bekomme aber keine Liste der verfügbaren Geräte! ... Vielleicht benutze ich diese Funktionen nicht richtig

#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); 
} 

Ich bin nicht sicher über diese Zeile, wie man korrekte Parameter übergibt.

[mgr scanForPeripheralsWithServices:nil options:nil];

Ich habe einen Blick in die Apple-Referenz geworfen ... und ich verstehe immer noch nicht, was diese CBUUID ist. Jedes Gerät hat eine Bluetooth-ID? wo kann ich es finden?

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

Parameter ServiceUUIDs - Ein Array von CBUUIDs, an denen die App interessiert ist. Options - Ein Wörterbuch zum Anpassen des Scans, siehe CBCentralManagerScanOptionAllowDuplicatesKey.

Gibt es eine andere Möglichkeit, Bluetooth unter IOS zu verwenden? Ich meine, ältere Frameworks, die BLE 4.0 nicht verwenden!

jeder Rat wäre dankbar!

vielen Dank!

48
mz87

Dieser Leitfaden sieht für Bluetooth 3.0 vielversprechend aus. Denken Sie daran, dass das CoreBluetooth-Framework NUR für Bluetooth Low Energy (4.0) gilt. Auf den Dev-Pages von bluetooth.org sehen Sie einige Beispiele für global definierte Dienste. Als Guan Yang-Mentionen können Sie sehen, dass der Herzfrequenz-Dienst 0x180D ist. Die UUIDs der Einheit werden vom Hersteller festgelegt. 

Hier ist ein Code-Snippet, der Ihnen möglicherweise dabei hilft. 

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

in Bluetooth gibt es "Dienste". Ein Gerät veröffentlicht 1..N-Dienste, und jeder Dienst hat 1..M-Eigenschaften. Jeder Dienst verfügt über eine eindeutige Kennung mit der Bezeichnung UUID.

Wenn beispielsweise ein Bluetooth-Sensor für die Herzfrequenz den Dienst "Herzfrequenz" anbietet, wird ein Dienst mit UUID 0x180D veröffentlicht.

(mehr Dienste hier )

Wenn Sie also eine Suche durchführen, müssen Sie als Kriterien ein UUID angeben, das den zu suchenden Dienst angibt.

15
viktorvogh

Sie sollten einen Blick auf eines der Beispiele werfen. Hier ist die relevante Zeile:

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

(Ich weiß, dass dies ein Mac OS X-Beispiel ist, aber die iOS CoreBluetooth-API ist sehr ähnlich.)

CBUUID identifiziert Dienste, an denen Sie interessiert sind, nicht Geräte. Standarddienste haben eine 16-Bit-UUID, in diesem Fall 0x180d für den Herzfrequenzmonitor oder möglicherweise 0x180a für Geräteinformationen, während proprietäre Dienste eine 128-Bit-UUID (16 Byte) besitzen.

Die meisten Geräte implementieren den Geräteinformationsdienst. Wenn Sie also nur nach einem Gerät suchen, können Sie [CBUUID UUIDWithString:@"180A"] versuchen.

10
Guan Yang

Versuchen Sie, dies zu geben, während Sie nach Geräten suchen 

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

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

sie können die Liste der Geräte unter der Delegatenmethode didDiscoverPeripheral abrufen

3
Jes

Behalten Sie die Ruhe und verwenden Sie https://github.com/l0gg3r/LGBluetooth

Alles was Sie tun müssen

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

0
l0gg3r