9

我扫描我的周围是这样的:Corebluetooth中央管理器回调didDiscoverPeripheral两次

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不允许多个外设,但有时回调触发两次。

- (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,名字仍然是正确的)。

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

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

+0

你给出的“不超过一个设备”参数是什么? – yuklai 2012-07-19 19:58:20

+0

false CBCentralManagerScanOptionAllowDuplicatesKey – chwi 2012-07-20 05:39:38

+0

我的猜测是当信号强度很差时它会被调用两次。 – 2012-07-21 05:53:36

回答

9

设备可能会在广告时返回其他数据。这些可能会在不同的时间到达不同的数据包。在这种情况下,didDiscoverPeripheral在设备最初被查看时被首先调用,然后当额外的信息变得可用时再次被调用。

CBCentralManagerScanOptionAllowDuplicatesKey是不同的。它告诉CoreBluetooth当设备再次宣传自己时是否要接收重复结果。它不会阻止对同一发现序列多次调用didDiscoverPeripheral;它阻止它重复发现序列。

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

+0

谢谢。你对如何解决这个问题有任何想法吗? – chwi 2012-07-31 04:59:47

+0

@Wilhelmsen:什么需要解决?只需跟踪你已经看到的UUID。 – 2012-07-31 15:10:10

+0

我试过@ Mike的回答,是不是也跟踪UUID?我对此很新,所以如果你有任何关于如何以编程方式实现这一点的进一步提示,我会非常感激!无论如何,非常感谢你的信息 – chwi 2012-08-01 07:40:50

6

我不认为这个参数做什么,你认为它。通过观察Apple健康温度计等Apple样本中的使用情况,我的理解是,将此标志置于开启状态可以发现具有相同UUID的多个不同外围设备。例如,如果您想编写一个应用程序查看同一房间内的四个不同温度计,并找到所有这些温度计,则需要该参数,以便在查找第一个温度计后不会停止扫描。

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

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

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

这将是很好,如果文件是在这一点上更清晰。我承认我猜根据参数在上下文中的使用方式。

+0

谢谢!这应该进入我的didDiscoverPeripheral方法吗? – chwi 2012-07-21 07:15:47

+0

是的,无论如何,这就是苹果公司所说的。请参阅http://developer.apple.com/library/mac/#samplecode/HealthThermometer/Listings/HealthThermometerClient_HealthThermometerClientAppDelegate_m.html#//apple_ref/doc/uid/DTS40011370-HealthThermometerClient_HealthThermometerClientAppDelegate_m-DontLinkElementID_4以获取完整的来源。 – Mike 2012-07-21 20:57:45

+0

我其实认为解决了它。我没有能够复制它如何:我会在我的问题上发布一个答案,只是为了澄清。非常感谢 – chwi 2012-07-24 12:23:24

相关问题