1

我正在尝试从几个蓝牙外围设备测量 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

4 回答 4

5

我相信您已经知道了这一点,但以防万一有人遇到这个(就像我刚刚做的那样)寻找其他信息,如果您没有使用其他带有 coreLocation 的 iOS 设备,则需要peripheralDidUpdateRSSI:使用[self.myPeripheral readRSSI];.

didUpdateValueForCharacteristic:您可以在 updateValue 委托中尽可能频繁地调用 RSSI 数据更新。

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

所以整体流程是:

检查您是否在获得 RSSI 数据的 NSLog 中接收 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 更新的委托:

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

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

于 2014-03-12T12:05:23.070 回答
2

(假设您使用的是 iOS 设备:)CoreBluetooth 可能故意限制它在天线上的活动速率。低功耗蓝牙、经典蓝牙和 Wi-Fi 在 iOS 设备上都位于同一根天线上,因此收音机会尽量将不必要的干扰降到最低。您可以尝试在 CoreBluetooth 上提交错误以添加选项或方式来控制更新频率,但我不认为他们会实施它,因为他们的主要设计目标是:1. 不会不必要地耗尽设备的电池和 2 . 与其他天线的收音机共存。(他们还在 Apple devforums 上的帖子中说,例如,如果你想要比 iOS BTLE 实现更高的数据速率,你应该使用蓝牙经典或专为它设计的东西。BTLE 意味着低 -权力首先是他们

于 2013-10-24T01:31:19.413 回答
0

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

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

于 2015-03-09T19:29:25.397 回答
0

外设根据外设的固件进行广告。这可以设置为低至 100 毫秒到几乎高达 2 秒。将 iOS 设备用作蓝牙外围设备时,我发现无法更改它。这是 Apple 的文档:查看第 3.5 节... https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf

于 2016-06-02T22:13:52.640 回答