Corebluetooth中央管理器回调didDiscoverPeripheral两次(Corebl

2019-06-26 10:17发布

我扫描我的周围是这样的:

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

有没有问题,我发现周围并能够连接到它。 正如你可以看到我给它CBCentralManagerScanOptionAllowDuplicatesKeybool NO不允许超过一个周,但有时didDiscoverPeripheral回调闪光两次。

- (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;

    }
}

didDiscoverPeripheral发生两次, service变成nil在此方法中,即使peripheral没有(UUID,名字仍然是正确的)。

重新启动手机或重置网络设置暂时修复该问题。

我真的需要这个固定! 谢谢

Answer 1:

设备可以同时广告返回附加数据。 这可能到达在不同的分组,在不同时间到达。 在这种情况下,didDiscoverPeripheral被称为第一,当设备最初看到的那样,然后再次时的附加信息变为可用它。

CBCentralManagerScanOptionAllowDuplicatesKey是不同的。 它告诉CoreBluetooth是否要在设备再次宣称自己收到重复的结果。 它不会阻止为同一序列,发现多次调用didDiscoverPeripheral; 它防止它重复发现的序列。

来源: http://lists.apple.com/archives/bluetooth-dev/2012/Apr/msg00047.html (蓝牙-dev的苹果REP)。



Answer 2:

我不认为这个参数做什么,你认为它。 我从看它是怎么样的苹果像健康温度计中使用的理解是,在打开此标志允许具有相同UUID的多个不同外设的发现。 例如,如果你想编写一个应用程序,着眼于四个不同的温度计在同一个房间,发现所有的人,你需要的参数,所以扫描未发现的第一个后停止。

在他们的代码,苹果避免了这样的重复:

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

如果器件在阵列中已经存在,则没有添加的第二时间。

这将是很好,如果文件是在这一点上更清晰。 我承认我是基于参数是如何在上下文中猜测。



文章来源: Corebluetooth central manager callback didDiscoverPeripheral twice