web-dev-qa-db-ja.com

2つのiOSデバイス間のBluetooth接続

私は試しています コアBluetoothフレームワーク iOS5.0で導入されました。 StackOverflow自体の多くのスレッド( 多くのスレッドの1つ )によると:

  1. コアBluetoothフレームワークを使用して、Bluetooth Low Energy(4.0)ハードウェアをサポートする[〜#〜]任意の[〜#〜]ハードウェアと通信できます。 。
  2. Core Bluetoothテクノロジーを使用している場合、Made For iPhone/iPod(MFI)プログラムを忘れることができます。

私はiPhone5、iPhone 4S、Google Android Nexus 7を持っており、少なくとも最初の2つはBLEのハードウェアをサポートしていると確信しています。

私の質問は

さて、私はiPhone 4S/iPhone 5で以下のコードを試しましたが、スキャンして近くに座っているiPhone5/iPhone4Sを見つけることができませんでした。確認できますが、両方のデバイスで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
12
Krishnabhadra

Spamsinkがコメントしたように、1つのデバイスは周辺機器として機能し、もう1つのデバイスは通信するために中央として機能する必要があります。

素晴らしい サンプルアプリ from Appleそれを行います。また、WWDC2012セッション703 CoreBluetooth 101 および705 ---をチェックしてください。 Advanced CoreBluetooth CoreBluetoothフレームワークの使用法の優れた説明と例。

また、デバイスを周辺機器モードにするには、iOS6.0以降に更新する必要があることに注意してください。

12
Filip Radelic

さて、Bluetooth Low Energy(BLE)全般についての私の理解は不十分でした。受け入れられた回答が指摘したように、1つのデバイスは中央として機能し、もう1つのデバイスは通信を行うための周辺機器として機能する必要があります

IOSからiOSおよびiOSからMacOSのBLE通信のソースコードの良い例は ここ です。

考慮すべきいくつかの重要なポイント

  1. iOS5.0では-> iPhoneはCentralとしてのみ機能するため、2つのiOSデバイス間の通信はできません。
  2. iOS 6.0では-> iPhoneは周辺機器としても機能します。したがって、通信を行うには、少なくとも1つのデバイスがiOS 6.0(およびおそらくそれ以降)で実行されている必要があります。
  3. BLEハードウェアが追加された最初のiPhoneデバイスはiPhone4Sです。そのため、iPhone4でiOS5を実行できたとしても、BLE通信はできません。

さていくつかの情報..

3
Krishnabhadra

didUpdateStateデリゲートでscanForPeripherals関数を呼び出すと、デリゲート関数が戻ることができないため、機能します。

1
user4376986