Как получить список доступных устройств Bluetooth?

В настоящее время я создаю приложение для iPhone (Xcode 4.3.1, IOS 5), которое может использовать устройства Bluetooth! Основная цель этого приложения-внутренняя навигация (GPS внутри зданий не очень точен).

единственное решение, которое я вижу здесь (чтобы сохранить мое приложение в AppStore), - это попробовать сканировать доступные устройства bluetooth!

Я пытался использовать corebluetooth framework, но я не получаю список доступных устройств! Возможно, я не использую эти функции правильно

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

Я не уверен в этой строке, как передать правильные параметры?

[mgr scanForPeripheralsWithServices:nil options:nil];

Я заглянул в справочник apple .. и я все еще не понимаю, что это такое CBUUID ??? У каждого устройства есть идентификатор bluetooth? где я могу его найти?

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

параметры serviceUUIDs - массив CBUUIDs приложение, который вас интересует. параметры-словарь для настройки сканирования см. В разделе CBCentralManagerScanOptionAllowDuplicateskey.

есть ли другой способ использовать Bluetooth на IOS? Я имею в виду старые фреймворки, которые не используют BLE 4.0!

любой совет был бы признателен!

спасибо!

5 ответов


данное руководство выглядит многообещающим для Bluetooth 3.0. Помните, что corebluetooth framework предназначен только для Bluetooth Low Energy (4.0). At bluetooth.org ' s dev-pages вы можете увидеть некоторые примеры глобально определенных услуг, и как Гуань Ян mentionen, вы можете видеть, что служба сердечного ритма 0x180D. UUID устройства определяется изготовителем.

вот фрагмент кода, который может помочь вам на этом пути.

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

в Bluetooth, есть "услуги". Устройство публикует 1..N услуги, и каждая услуга имеет 1..M характеристика. Каждая служба имеет уникальный идентификатор, называемый UUID.

например, датчик пульса Bluetooth, который предлагает услугу "пульс", публикует услуг с UUID 0x180D.

(дополнительные услуги здесь)

поэтому, когда вы выполняете поиск, вы должны предоставить UUID as критерии, указывающие, какой сервис искать.


вы должны взглянуть на один из примеров. Вот соответствующая строка:

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

(Я знаю, что это пример Mac OS X, но API CoreBluetooth iOS очень похож.)

CBUUID определяет службы, которые вас интересуют, а не устройства. Стандартные службы имеют 16-битный UUID, в этом случае 0x180d для монитора сердечного ритма или, возможно, 0x180a для информации об устройстве, в то время как проприетарные службы имеют 128-битный UUID (16 байт).

большинство устройства реализуют информационную службу устройства, поэтому, если вы просто ищете любое устройство, вы можете попробовать [CBUUID UUIDWithString:@"180A"].


попробуйте дать это во время сканирования устройств

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

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

вы сможете получить список устройств didDiscoverPeripheral метод


сохраняйте спокойствие и используйте https://github.com/l0gg3r/LGBluetooth

все, что вам нужно сделать

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