Подтвердить что ты не робот

Соединение Bluetooth между двумя устройствами iOS

Я пробовал Базовая инфраструктура Bluetooth, представленная в iOS 5.0. По многим темам (один из многих) по самому StackOverflow:

  • Базовая структура Bluetooth может использоваться для связи с ЛЮБОЙ аппаратное обеспечение, поддерживающее Bluetooth Low Energy (4.0).
  • Мы можем забыть о программе Made For iPhone/iPod (MFI), если вы используя технологию Core Bluetooth.

У меня есть iPhone 5, iPhone 4S, Google Android Nexus 7, и я уверен, что, по крайней мере, у первых 2 есть аппаратная поддержка BLE.

Мой вопрос

Ну, я попробовал приведенный ниже код на моем iPhone 4S/iPhone 5, но он не смог отсканировать и найти iPhone5/iPhone 4S, сидящий рядом. Я могу подтвердить, что оба устройства включили Bluetooth. Метод делегата didDiscoverPeripheral никогда не будет вызван. Каковы могут быть причины? Я что-то пропустил?

Это мой код (урезанный до небольшого тестового проекта).

ViewController.h

@interface ViewController:UIViewController<CBCentralManagerDelegate, CBPeripheralDelegate{
}
@property (strong, nonatomic) CBCentralManager *mCentralManager;
@end

ViewController.m

@implementation ViewController
@synthesize mCentralManager;

- (void)viewDidLoad{
    [super viewDidLoad];
    mCentralManager = [[CBCentralManager alloc]initWithDelegate:self queue:nil];
    [self scanForPeripherals];
}

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
    NSLog(@"Received periferal :%@",peripheral);
}

- (int) scanForPeripherals {
    if (self.mCentralManager.state != CBCentralManagerStatePoweredOn)
    {
        NSLog(@"self.mCentralManagerState : %d",self.mCentralManager.state);
        return -1;
    }
    //Getting here alright.. bluetooth is powered on.
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], CBCentralManagerScanOptionAllowDuplicatesKey, nil];
    //Documentation says passind nil as device UUID, scans and finds every peripherals
    [self.mCentralManager scanForPeripheralsWithServices:nil options:options];
    return 0;
}
@end
4b9b3361

Ответ 1

Как прокомментировал спамсинк, одно устройство должно действовать как периферийное, а одно - как центральное, чтобы они могли общаться.

От Apple Apple делает отличное пример приложения. Кроме того, ознакомьтесь с сессиями WWDC 2012 года 703 - CoreBluetooth 101 и 705 - Advanced CoreBluetooth для подробного объяснения и примеров использования каркаса CoreBluetooth.

Также обратите внимание, что для устройства, находящегося в периферийном режиме, его необходимо обновить до версии iOS 6.0 или новее.

Ответ 2

Хорошо, мое понимание общей слабости Bluetooth (BLE) было плохим. Как отметил принятый ответ, одно устройство должно действовать как центральное, а другое должно действовать как периферийное для связи.

Хороший пример исходного кода для обмена сообщениями iOS и iOS и iOS для Mac OS. здесь.

Некоторые важные моменты для рассмотрения

  • на iOS 5.0 → iPhone может действовать только как центральный, поэтому связь между двумя устройствами iOS невозможно.
  • на iOS 6.0 → iPhone может действовать как периферийный тоже. связь должна происходить, по крайней мере, одно устройство должно работать iOS 6.0 (и, возможно, позже).
  • Первое устройство iPhone с добавленным оборудованием BLE - iPhone 4S. Так что даже если iPhone 4 может запускать iOS 5, связь BLE на нем невозможна.

Ну какая-то информация..

Ответ 3

если вы вызываете функцию scanForPeripherals в делегате didUpdateState, тогда она работает, потому что функции делегата не могут вернуться.