chw*_*hwi 10 iphone objective-c callback core-bluetooth bluetooth-lowenergy
我像这样扫描我的外围设备:
NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO]
forKey:CBCentralManagerScanOptionAllowDuplicatesKey];
// Scan for peripherals with given UUID
[cm scanForPeripheralsWithServices:[NSArray arrayWithObject:HeliController.serviceUUID] options:scanOptions]
Run Code Online (Sandbox Code Playgroud)
没问题,我找到外围设备并能够连接到它.正如你可以看到我给它CBCentralManagerScanOptionAllowDuplicatesKey用bool 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");
}
}
Run Code Online (Sandbox Code Playgroud)
有时我得到
Discovered
Already discovered
Run Code Online (Sandbox Code Playgroud)
作为我的控制台中的输出,大多数时候只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;
}
}
Run Code Online (Sandbox Code Playgroud)
当didDiscoverPeripheral发生两次时,service变成nil这种方法,即使peripheral不是(UUID,名称仍然正确).
重新启动手机或重置网络设置可以暂时解决问题.
我真的需要解决这个问题!谢谢
Gle*_*ard 11
设备可能会在广告时返回其他数据.这些可以分开到达,在不同时间到达.在这种情况下,在最初看到设备时首先调用didDiscoverPeripheral,然后在有可用的附加信息时再次调用.
CBCentralManagerScanOptionAllowDuplicatesKey是不同的.它告诉CoreBluetooth当设备再次通告自己时是否要接收重复的结果.它不会阻止多次调用didDiscoverPeripheral用于相同的发现序列; 它会阻止它重复发现序列.
来源:http://lists.apple.com/archives/bluetooth-dev/2012/Apr/msg00047.html(蓝牙-dev上的Apple代表).
我不认为这个参数符合你的想法.通过研究如何在健康温度计等Apple样本中使用它,我的理解是,打开此标志可以发现具有相同UUID的多个不同外围设备.例如,如果您想编写一个应用程序来查看同一房间中的四个不同的温度计,并找到所有这些温度计,则需要参数,以便在找到第一个之后扫描不会停止.
在他们的代码中,Apple避免重复这样的:
NSMutableArray *peripherals = [self mutableArrayValueForKey:@"thermometers"];
if( ![self.thermometers containsObject:peripheral] )
[peripherals addObject:peripheral];
Run Code Online (Sandbox Code Playgroud)
如果设备已存在于阵列中,则不会再次添加该设备.
如果文档在这一点上更清楚,那将是很好的.我承认我猜测的是基于参数在上下文中的使用方式.
| 归档时间: |
|
| 查看次数: |
10418 次 |
| 最近记录: |