gpt4 book ai didi

android - altbeacon 以 10Hz 连续检测信标 RSSI 值

转载 作者:行者123 更新时间:2023-12-02 04:07:56 25 4
gpt4 key购买 nike

我创建了一个 android (java) 应用程序,它使用 altbeacon 库 ( github page ) 通过蓝牙模块检测信标。

信标配置了 Eddystone UID、广告间隔为 100ms 的协议(protocol)以及强传输功率级别 (10dBm)。我希望能够以 10Hz(即 100ms)的频率检测信标的 RSSI 值。

我已经准备了一个实现altbeacon库的服务,相关部分如下所示:

mBeaconManager = BeaconManager.getInstanceForApplication(this);

beaconRegion = new Region("beacon_region", null, null, null);

// use Eddystone protocol
mBeaconManager.getBeaconParsers().add(new BeaconParser().
setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));

mBeaconManager.setAndroidLScanningDisabled(true);
mBeaconManager.setForegroundScanPeriod(100l); // scan frequency
mBeaconManager.setForegroundBetweenScanPeriod(0);

以及回调didRangeBeaconsInRegion,我从中看到信标并获取RSSI值是这样的:

@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
Log.i(BeaconDataCollectorService.class.getSimpleName(), String.format("Found %s beacons in range", beacons.size()));
}

What's my problem? Running the app, I notice that within didRangeBeaconsInRegion, I often don't see all the beacons.

我运行了几秒钟的数据收集,创建了所获得数据的csv格式,您可以看到我经常有0(表示未检测到信标);我把这个csv的分享放在pastebin上(https://pastebin.com/zkUZC5R4)

如何通过始终能够检测到所有信标来提高扫描频率?

使用的altbeacon版本:

implementation 'org.altbeacon:android-beacon-library:2.16.3'

Android版本:9

谢谢

最佳答案

不幸的是,该库的设计初衷并不是这样做,因为测距 API 是根据 iOS 等效项建模的,它以固定的时间间隔进行聚合检测,而不是在单个数据包到达时对其进行访问。

在如此短的扫描周期内经常检测到 0 个信标的主要原因是扫描每 100 毫秒打开和关闭一次,并且启动和停止需要 10 毫秒左右。这使得错过检测的可能性很大。

这是个好消息:如果库在同一扫描周期内检测到两个信标数据包,那么它将停止关闭扫描,并且您的检测率将会提高。但是要让它在 100 毫秒内检测到两个信标几乎是不可能的,因为您的信标以标称 10Hz 进行广告。

您可以尝试的一件事是将扫描周期设置为 1 秒。在 10 秒左右检测到有限数量的信标后,您很有可能在一个扫描周期内检测到两个信标,然后您可以切换到 100 毫秒的扫描周期并获得更高的检测率。

您永远不会获得 100% 的检测率,原因有二:

  • 由于冲突和 radio 噪声,并非所有传输的信标数据包都会被接收。近距离时,通常为 80-90%。

  • “BLE 广告商不会定期进行广告。他们会随机发送数据包以避免冲突。标称 10Hz 发射器的各个数据包之间可能有 70 毫秒到 140 毫秒之间的间隔,因此对于 100ms 的固定扫描周期,有时会有 0、1 或 2 个 Packers 符合接收条件。

如果您确实需要在每次检测时获得回调,您可以尝试在 BeaconManager 中设置 NonBeaconBleScanCallback,然后调用 BeaconManager.clearBeaconParsers() 。这将导致所有信标检测在检测到时立即发送到该回调。然后,您必须构造一个新的 BeaconParser,以便在该回调中使用,以从原始数据包中解码信标。使用beaconParser.parse(...)

关于android - altbeacon 以 10Hz 连续检测信标 RSSI 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60317899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com