刷新许多蓝牙外设的RSSI值

我试图从几个蓝牙外设iOS(6与BLE)mesure 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的结果似乎更可靠。

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

谢谢

编辑:我也试图快速启动/停止扫描,似乎在开始扫描检测到更多的设备和更新更频繁

我相信你已经知道了这一点,但只是为了防止有人遇到这种情况(就像我刚刚那样)寻找其他信息,如果你不使用其他iOS设备与coreLocation你需要调用peripheralDidUpdateRSSI:委托[self.myPeripheral readRSSI];

您可以调用didUpdateValueForCharacteristic: RSSI数据更新didUpdateValueForCharacteristic:只要您在updateValue委托中一次就可以调用。

你不需要这个viewDidLoad: NSDictionary *options = etc...这个NSDictionary是在didDiscoverPeripheral: delegate中创build的。

所以总体stream量是:

检查您是否在NSLog中获得RSSI数据的RSSI …

 - (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 ... } 

调用peripheralDidUpdateRSSI:在这里,因为如果你已经设置了通知值为YES [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 } 

readRSSI将在每次更新以前的特征值时调用您在UILabel上执行RSSI更新的readRSSI (或者您正在使用的任何内容):

 - (void)peripheralDidUpdateRSSI:(CBPeripheral *)peripheral error:(NSError *)error; { _rssiLabel.text = [self.myPeripheral.RSSI stringValue]; NSLog(@"RSSI Method”); } 

如果你不需要你的应用程序的特征值,只需要在那里运行一个循环,无论你需要RSSI值刷新的时间。

(假设你在iOS设备上)CoreBluetooth可能会故意限制它在天线上的活动速率。 蓝牙LE,蓝牙经典和Wi – Fi都在iOS设备上的同一天线,所以无线电设备尽量保持不必要的喋喋不休。 您可以尝试在CoreBluetooth上添加一个bug来添加一个选项或者控制更新频率的方法,但是我不认为他们会实现这个function,因为他们的主要devise目标是:1.不会不必要地浪费设备的电池,2与其他天线的无线电共存。 (他们也在苹果devforums的post中说过,例如,如果你想要比iOS BTLE实现更高的数据速率,你应该使用Bluetooth Classic或者是专门为它devise的东西,权力首先,他们已经把它的逻辑结束。)

的确, peripheral.readRSSI()peripheralDidUpdateRSSI之间的延迟就像一秒钟!

我认为最好的办法是读取BLE设备本身的RSSI值并发送给iOS设备。

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