10

次のように周辺機器をスキャンします。

NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] 
                                                            forKey:CBCentralManagerScanOptionAllowDuplicatesKey];
        // Scan for peripherals with given UUID
        [cm scanForPeripheralsWithServices:[NSArray arrayWithObject:HeliController.serviceUUID] options:scanOptions]

問題ありません。周辺機器が見つかり、接続できました。ご覧のとおり、複数のペリフェラルを許可しないようにしていCBCentralManagerScanOptionAllowDuplicatesKeyますが、コールバックが 2 回発生することがあります。bool NOdidDiscoverPeripheral

- (void) centralManager:(CBCentralManager *)central 
  didDiscoverPeripheral:(CBPeripheral *)peripheral 
  advertisementData:(NSDictionary *)advertisementData 
               RSSI:(NSNumber *)RSSI 
{        
if(!discovered){
    discovered = YES;
    NSLog(@"Discovered");

    [cm stopScan];

    [scanButton setTitle:@"Connect" forState:UIControlStateNormal];
}
else if(discovered){
    discovered = YES
    NSLog(@"Already discovered");
}
}

時々私は得る

Discovered
Already discovered

私のコンソールの出力として、ほとんどの場合、Discoveredメッセージのみが表示されます。

ペリフェラル デリゲートでは、最初にサービスを検出し、それが呼び出さ[peripheral discoverCharacteristicsれ、コールバックが常に発生します。

- (void) peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error{

NSLog(@"Did discover characteristic for service %@", [service.peripheral UUID]);

for(CBCharacteristic *c in [service characteristics]){
    // We never get here when peripheral is discovered twice
    if([[c UUID] isEqual:myCharacteristicUUID]){

        NSLog(@"Found characteristic");

        self.throttleCharacteristic = c;

    }
}

didDiscoverPeripheral2回発生すると、このメソッドにserviceなりますが、そうではありません(UUID、名前はまだ正しいです)。nilperipheral

電話を再起動するか、ネットワーク設定をリセットすると、問題が一時的に修正されます。

私は本当にこれを修正する必要があります!ありがとうございました

4

2 に答える 2

12

デバイスは、広告中に追加のデータを返す場合があります。これらは別々のパケットで到着し、異なる時間に到着する場合があります。この場合、最初にデバイスが表示されたときに didDiscoverPeripheral が呼び出され、追加情報が利用可能になったときに再度呼び出されます。

CBCentralManagerScanOptionAllowDuplicatesKey は異なります。デバイスが再びアドバタイズするときに、重複した結果を受け取るかどうかを CoreBluetooth に伝えます。同じ検出シーケンスに対する didDiscoverPeripheral への複数の呼び出しは防止されません。検出シーケンスが繰り返されるのを防ぎます。

ソース: http://lists.apple.com/archives/bluetooth-dev/2012/Apr/msg00047.html (bluetooth-dev の Apple 担当者)。

于 2012-07-30T23:44:10.580 に答える
6

このパラメータは、あなたが思っていることをしているとは思いません。Health ThermometerなどのAppleサンプルでどのように使用されているかを調べて理解したところ、このフラグをオンにすると、同じUUIDを持つ複数の異なる周辺機器を検出できるようになります。たとえば、同じ部屋にある4つの異なる温度計を調べてすべてを検出するアプリを作成する場合は、最初の温度計を検出した後にスキャンが停止しないようにパラメーターが必要になります。

彼らのコードでは、Appleは次のような重複を避けています:

NSMutableArray *peripherals = [self mutableArrayValueForKey:@"thermometers"];
if( ![self.thermometers containsObject:peripheral] )
    [peripherals addObject:peripheral];

デバイスがすでにアレイに存在する場合、それは2回目に追加されません。

この点に関して、ドキュメントがより明確になっていると便利です。パラメータがコンテキストでどのように使用されているかに基づいて推測していることを認めます。

于 2012-07-20T22:26:25.223 に答える