Как получить список доступных 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];

Я посмотрел на ссылку на яблоко... и я до сих пор не понимаю, что это за CBUUID??? У каждого устройства есть какой-то блютуз-идентификатор? Где я могу найти его?

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

Параметры serviceUUIDs - Массив CBUUID, которые интересуют приложение. Options - Словарь для настройки сканирования, см. CBCentralManagerScanOptionAllowDuplicatesKey.

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

Любой совет будет принят во внимание!

Спасибо!

5 ответов

Решение

Это руководство выглядит многообещающе для Bluetooth 3.0. Помните, что платформа CoreBluetooth предназначена ТОЛЬКО для Bluetooth Low Energy (4.0). На страницах разработчиков bluetooth.org вы можете увидеть некоторые примеры глобально определенных сервисов, и, как упоминает Гуань Ян, вы можете увидеть, что частота пульса составляет 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 в качестве критерия, указывающего, какую службу искать.

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

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

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

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) {
     }];

Другие вопросы по тегам