我刚刚开始使用iOS的核心蓝牙框架,我正在开发一个需要不断扫描BLE设备的应用程序,以便我可以每分钟检索一次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 :(得分:3)
就我所知,这应该做你想要的。
当您开始使用原始呼叫扫描外围设备时,您的代理人应该在发现BLE设备时开始接听电话。这将继续,直到您通过调用
停止扫描[manager stopScan];
我认为你实际上不需要在你的centralManager:didRetrievePeripherals方法中第二次调用scanForPeripheralsWithServices,因为据我所知,扫描不会停止,直到你告诉它为止。不过,我现在仍然开始研究这个问题,但是我可能还没有找到超时。
我很确定你每分钟拨打一次电话的原因是因为BLE设备只是经常发布广告。如果它更频繁地做广告,比如处于发现模式的设备,我认为你会更频繁地接听电话。如果你能证实这一点我会很有趣。如果设备具有发现模式,您可以尝试触发它以查看通知是否加速。
答案 1 :(得分:2)
您不应该进行连续扫描,因为它的耗电成本非常高。一旦发现设备,就会有一系列CBPeripheral对象返回给您。在CBPeripheral上,您可以读取RSSI并在RSSI更改时获得回调。请参阅以下文档: http://developer.apple.com/library/mac/#documentation/CoreBluetooth/Reference/CBPeripheralDelegate_Protocol/translated_content/CBPeripheralDelegate.html
答案 2 :(得分:1)
快速实施@Anders解决方案:
manager.scanForPeripheralsWithServices(nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey : NSNumber(bool: true)])