私は試しています コアBluetoothフレームワーク iOS5.0で導入されました。 StackOverflow自体の多くのスレッド( 多くのスレッドの1つ )によると:
私はiPhone5、iPhone 4S、Google Android Nexus 7を持っており、少なくとも最初の2つはBLEのハードウェアをサポートしていると確信しています。
さて、私はiPhone 4S/iPhone 5で以下のコードを試しましたが、スキャンして近くに座っているiPhone5/iPhone4Sを見つけることができませんでした。確認できますが、両方のデバイスでBluetoothがオンになっています。デリゲートメソッドdidDiscoverPeripheral
が呼び出されることはありません。理由は何でしょうか?私は何かが足りないのですか?
これは私のコードです(小さなテストプロジェクトに分解されました)。
@interface ViewController:UIViewController<CBCentralManagerDelegate, CBPeripheralDelegate{
}
@property (strong, nonatomic) CBCentralManager *mCentralManager;
@end
@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
Spamsinkがコメントしたように、1つのデバイスは周辺機器として機能し、もう1つのデバイスは通信するために中央として機能する必要があります。
素晴らしい サンプルアプリ from Appleそれを行います。また、WWDC2012セッション703 CoreBluetooth 101 および705 ---をチェックしてください。 Advanced CoreBluetooth CoreBluetoothフレームワークの使用法の優れた説明と例。
また、デバイスを周辺機器モードにするには、iOS6.0以降に更新する必要があることに注意してください。
さて、Bluetooth Low Energy(BLE)全般についての私の理解は不十分でした。受け入れられた回答が指摘したように、1つのデバイスは中央として機能し、もう1つのデバイスは通信を行うための周辺機器として機能する必要があります。
IOSからiOSおよびiOSからMacOSのBLE通信のソースコードの良い例は ここ です。
考慮すべきいくつかの重要なポイント
さていくつかの情報..
didUpdateStateデリゲートでscanForPeripherals関数を呼び出すと、デリゲート関数が戻ることができないため、機能します。