核心蓝牙 - 范围内设备的不断RSSI更新

时间:2012-03-28 15:44:42

标签: ios ios5 core-bluetooth

我刚刚开始使用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分钟扫描一次,但我不知道为什么会有效...

关于核心蓝牙的文档相当稀疏,所以如果有人知道如何做到这一点,或者有更好的方法来做我想要完成的事情,我会很感激帮助!

3 个答案:

答案 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)])