2012-03-28 11 views
13

iOS用のコアBluetoothフレームワークから始めたばかりで、毎分または毎分のRSSI番号を取得できるようにBLEデバイスを常にスキャンする必要があるアプリケーションを開発していますそう。コアのBluetooth - 範囲内のデバイスの一定のRSSIアップデート

現在、私が持っている:

manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil]; 
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
[manager scanForPeripheralsWithServices:nil options:options]; 

これは、BLEデバイスのための私のアプリのスキャンを開始し、デバイスが検出されたときに、このデリゲートメソッドを呼び出します。

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { 
    NSLog(@"Did discover peripheral. peripheral: %@ rssi: %@, UUID: %@ advertisementData: %@ ", peripheral, RSSI, peripheral.UUID, advertisementData); 
    //Do something when a peripheral is discovered. 

    rssiLabel.text = [RSSI stringValue]; 

    [manager retrievePeripherals:[NSArray arrayWithObject:(id)peripheral.UUID]];} 

この方法は私を取得し、周辺のRSSI数います私は表示することができます。最後の行は、このデリゲートメソッドを呼び出します。

- (void) centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *)peripherals { 

    NSLog(@"Currently known peripherals :"); 
    int i = 0; 
    for(CBPeripheral *peripheral in peripherals) { 
     NSLog(@"[%d] - peripheral : %@ with UUID : %@",i,peripheral,peripheral.UUID); 

    } 

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:FALSE], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
    [manager scanForPeripheralsWithServices:nil options:options]; 

} 

このコードは、スキャンおよそ1分毎に作業してやっているように見えるが、それは働いて、なぜ私は正確に分からない...

ドキュメントコアのブルートゥースはかなり疎であるので、もし誰かがこれをやる方法について何か考えているのであれば、私が達成しようとしていることをする良い方法があります。

+0

が動作しているようだ...どのくらいの頻度でRSSIが更新されますか?編集:1分に1回?私はあなたが接続していないときにタイムアウトがあると思うので、スキャンをもう一度開始します。 – chwi

+0

私は自分でドキュメントを読んでいます。だから、私よりもさらに進んでいます。質問、なぜあなたは代理メソッドdidRetrievePeripheralsのscanForPeripheralsWithServicesを呼び出していますか? CBCentralManagerが割り当てられた後は、すでにそれを呼び出しています。これはあなたが言及した繰り返しスキャンを引き起こしている可能性があります。 – mkr707

+0

> = 7.0のための私の2セント:retrievePeripheralsWithIdentifiersは今から使用する必要があります。 –

答えて

20

スキャンオプションを「はい」に変更しましたか?

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 
[manager scanForPeripheralsWithServices:nil options:options]; 

あなたがこれを行う場合、私は同じのために多くのことを変え、このコールバックのタイミングを参照してくださいが、あなたは(通常、約100ms毎にされるであろう、あなたのiPhoneで見られているすべての広告パケットを使用して「didDiscoverPeripheral」コールバックを取得しますデバイス)。これには、各デバイスのRSSIが含まれます。

これは〜1分の更新レートよりもはるかに速くなければなりません。 @Andersソリューションの

+1

これらの2行のSwiftに相当するものは何ですか? – Gerard

+0

@ジェラード:下記の私の答えを参照してください。 – kbpontius

+1

Swift3: 'manager.scanForPeripherals(withServices:[sensorTagAdvertisingUUID]、オプション:[CBCentralManagerScanOptionAllowDuplicatesKey:NSNumber(value:true)])' – nablahero

3

私が見る限り、これはあなたが望むことを行うはずです。

元の呼び出しで周辺機器のスキャンを開始したときに、BLEデバイスが検出されたときはいつでも、代理人が呼び出しを開始する必要があります。以来、didRetrievePeripherals方法、スキャンdoesnの私の知る限りでは、:あなたは

[manager stopScan]; 

に呼び出してスキャンを停止し、私はあなたが実際にあなたのcentralManagerでscanForPeripheralsWithServicesへの2回目の呼び出しを必要としないと思うまでこれが継続されますあなたがそれを言うまで止まらない。私はまだこれを開始していますが、まだ見つからないタイムアウトがあるかもしれません。

BLEデバイスがたびたび広告を出すだけなので、1分おきに電話を受ける理由は間違いありません。発見モードのデバイスのように、より頻繁にアドバタイズすると、より頻繁に呼び出すようになると思います。もしあなたがそれを確認できるなら、私は面白いだろう。デバイスに検出モードがある場合は、トリガして通知が高速化するかどうかを確認してください。

2

電源のために非常にコストがかかるので、連続スキャンは行わないでください。デバイスを発見すると、CBPeripheralオブジェクトの配列が返されます。 CBPeripheralでは、RSSIを読み取って、RSSIが変更されたときにコールバックを取得できます。次のドキュメントを参照してください。 http://developer.apple.com/library/mac/#documentation/CoreBluetooth/Reference/CBPeripheralDelegate_Protocol/translated_content/CBPeripheralDelegate.html

+0

' - [readRSSI]'はペリフェラルを接続する必要がありますか? –

+2

@BenMosherはいそうです。 – luxcem

1

スウィフト実装:

manager.scanForPeripheralsWithServices(nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey : NSNumber(bool: true)]) 
関連する問題