刷新许多蓝牙外设的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