我正试图在几个蓝牙外设上测试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的结果似乎更可靠。
我正在寻找一种方法来“刺激”外围设备,以便在扫描模式下更频繁地更新,或者一次连接到多个外设。
由于
编辑:我也尝试过快速启动/停止扫描,似乎在启动扫描时检测到更多设备并且更新更频繁
答案 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