刷新许多蓝牙外设的RSSI值

时间:2013-07-18 09:23:15

标签: ios objective-c bluetooth core-bluetooth bluetooth-lowenergy

我正试图在几个蓝牙外设上测试iOS(6个带BLE)上的RSSI指示器。 我可以通过scanForPeripheral获得RSSI:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil];

[_manager scanForPeripheralsWithServices:nil
                                 options:options];

加上:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {

这有效但我无法控制数据包接收率,结果似乎不确定。

我读过:https://stackoverflow.com/a/12486927/270209但我的速度根本不接近100毫秒(更多1~2秒)

如果我连接到设备,则readRSSI的结果似乎更可靠。

我正在寻找一种方法来“刺激”外围设备,以便在扫描模式下更频繁地更新,或者一次连接到多个外设。

由于

编辑:我也尝试过快速启动/停止扫描,似乎在启动扫描时检测到更多设备并且更新更频繁

4 个答案:

答案 0 :(得分:4)

我确定你已经弄清楚了这一点,但万一有人碰到这个(就像我刚才那样)寻找其他信息,如果你没有使用其他iOS设备和coreLocation你需要调用{ {1}}使用peripheralDidUpdateRSSI:进行委托。

您可以在updateValue委托中随时在[self.myPeripheral readRSSI];中调用RSSI数据更新。

在viewDidLoad中你不需要这个: didUpdateValueForCharacteristic:此NSDictionary是在NSDictionary *options = etc...委托中创建的。

所以整体流程将是:

检查您是否在获取RSSI数据的NSLog中接收RSSI ...

didDiscoverPeripheral:

在此处拨打- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{ NSString *localName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey]; if ([localName length] > 0){ NSLog(@"Discovered: %@ RSSI: %@", peripheral.name, RSSI); // your other needs ... } ,因为如果您将通知值设置为YES peripheralDidUpdateRSSI:

,那么这将是连续更新的地方
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
每次更新以前的特征值时,

- (void) peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{ //Call the peripheralDidUpdateRSSI delegate .. [self.myPeripheral readRSSI]; // do all of your other characteristic value updates here } 都会调用您在UILabel上执行RSSI更新的代理(或者您正在使用的任何内容):

readRSSI

如果您不需要应用程序的特征值,只需在其中运行循环,无论何时需要刷新RSSI值。

答案 1 :(得分:1)

(假设您使用的是iOS设备:) CoreBluetooth可能会故意限制它在天线上的活动速率。蓝牙LE,蓝牙经典和Wi-Fi都在iOS设备上的同一天线上,因此无线电尝试将不必要的聊天保持在最低限度。您可以尝试在CoreBluetooth上添加一个错误来添加控制更新频率的选项或方法,但我认为他们不会实现它,因为他们的主要设计目标是:1。不要不必要地耗尽设备的电池2与其他天线的无线电共存。 (他们也曾在Apple发布的帖子中说过,例如,如果你想要比iOS BTLE实现更高的数据速率,你应该使用蓝牙经典或专为它设计的东西.BTLE意味着低 - 首先是权力,他们已经把它带到了逻辑终点。)

答案 2 :(得分:0)

确实,peripheral.readRSSI()peripheralDidUpdateRSSI之间的延迟就像是第二个!

我认为最好的方法是读取BLE设备本身的RSSI值并将其发送到iOS设备。

答案 3 :(得分:0)

外围设备根据外围设备的固件进行广告宣传。这可以设置为从100ms低到几乎高达2秒。 当使用iOS设备作为蓝牙外设时,我发现无法改变它。  这是Apples文档:请参阅第3.5节...... https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf