草庐IT

android - Altbeacon 库测距只有 30% 的时间检测到信标

coder 2023-12-27 原文

我正在使用 AltBeacon 库来对我设备附近的信标进行测距。我使用了库的所有默认值,即扫描周期为 1100 毫秒,扫描周期之间为 0 毫秒。

库每 1100 毫秒调用一次我的监听器,但问题是在很多此类调用中,没有信标检测。信标仅检测到大约 30%-40% 的调用,另外 70% 的调用表示周围没有信标。

我该怎么做才能解决这个问题?

问候

最佳答案

在查看私下发送的非常大的 50 秒 LogCat 摘录后,我看到以不规则的间隔检测到两个信标:

Beacon #1 7383942b-xxxx-xxxx-xxxx-xxxxxxxxxxxx id2: 5 id3: 5000
   Max time between detections:   5.75600001 s
   Mean time between detections:  2.03854544 s
   % range cycles with detection: 51%

Beacon #2 b9407f30-xxxx-xxxx-xxxx-xxxxxxxxxxxx id2: 60039 id3: 2279
   Max time between detections:   4.794999515 s
   Mean time between detections:  1.377583336 s
   % range cycles with detection: 82 %

库代码按预期每 1100 毫秒开始和停止蓝牙扫描,并且在 89% 的测距周期中,至少检测到两个信标之一。这表明应用程序、库和操作系统都在正常工作——没有很长一段时间没有检测到信标。更重要的是,每个信标的 RSSI 表明一个相当强的信号,该信号在日志期间相当一致。但是信标的检测间隔是高度不规则的。这是不寻常的。

这表明信标、手机或 radio 环境存在一些 radio 或硬件问题。几种可能性:

  1. 信标确实没有定期传输,实际上确实有丢失。 (如果您使用两种不同的信标模型,这似乎不太可能。)
  2. 手机的蓝牙硬件存在问题,导致它丢失大量蓝牙广告数据包(可能是由于 CRC 错误),因此操作系统、库和应用程序永远看不到它们。
  3. 测试是在一个 radio 噪声很大的地方进行的,这导致了可能性 2 中提到的 CRC 错误。

我认为 Android 设备出现问题的可能性最大,尽管我承认这是我见过的第一个此类案例。我建议您尝试使用第二个 Android 设备,看看是否可以重现该问题。由于这可能是硬件问题,因此记录您正在使用的设备型号会很有用。

编辑:提问者在线下发送了额外的信息,说他使用的是带有 2.0-beta7 版本库的 Nexus 5,并说这个问题过去并不存在,只是在升级时才出现到这个库的这个版本。我自己在 Nexus 5 和库的 2.0-beta7 版本上做了一些额外的测试,修改了 android-beacon-library-reference应用程序在每个测距回调中添加以下代码:

public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
    if (beacons.size() > 0) {
        EditText editText = (EditText)RangingActivity.this
                .findViewById(R.id.rangingText);
        int rssi = -100;
        for (Beacon beacon: beacons) {
            logToDisplay("Beacon "+beacon.toString()+" is about "+beacon.getDistance()+" meters away, with Rssi: "+beacon.getRssi());
            if (beacon.getId1().toString().equals("2f234454-cf6d-4a0f-adf2-f4911ba9ffa6") && beacon.getId2().toString().equals("1") && beacon.getId3().toString().equals("1")) {
                rssi = beacon.getRssi();
            }
        }
        if (rssi > -100) {
            Log.d(TAG, "Beacon found in ranging cycle.  rssi: "+rssi);
        }
        else {
            Log.d(TAG, "Beacon not found in ranging cycle");
        }

    }
}

然后我用 2f234454-cf6d-4a0f-adf2-f4911ba9ffa6/1/1 在 10Hz 下打开 RadBeacon USB 传输,然后使用过滤器和下面的结果查看调试输出。如您所见,在我运行测试的 60 秒内没有任何循环未检测到任何信标。

$ adb logcat -v time | grep "ranging cycle"

10-07 15:17:00.076 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -67
10-07 15:17:01.180 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -73
10-07 15:17:02.287 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -75
10-07 15:17:03.422 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -66
10-07 15:17:04.545 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -67
10-07 15:17:05.714 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -66
10-07 15:17:06.815 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -66
10-07 15:17:07.989 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -65
10-07 15:17:09.087 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -72
10-07 15:17:10.198 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -65
10-07 15:17:11.322 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -71
10-07 15:17:12.484 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -67
10-07 15:17:13.587 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -64
10-07 15:17:14.758 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -66
10-07 15:17:15.867 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -66
10-07 15:17:16.998 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -66
10-07 15:17:18.195 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -67
10-07 15:17:19.280 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -67
10-07 15:17:20.415 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -67
10-07 15:17:21.560 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -66
10-07 15:17:22.659 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -67
10-07 15:17:23.802 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -66
10-07 15:17:25.035 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -66
10-07 15:17:26.189 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -67
10-07 15:17:27.331 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -73
10-07 15:17:28.458 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -67
10-07 15:17:29.618 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -67
10-07 15:17:30.756 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -84
10-07 15:17:31.886 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -76
10-07 15:17:33.047 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -76
10-07 15:17:34.193 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -85
10-07 15:17:35.339 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -83
10-07 15:17:36.502 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -90
10-07 15:17:37.683 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -78
10-07 15:17:38.871 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -87
10-07 15:17:40.079 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -90
10-07 15:17:41.234 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -85
10-07 15:17:42.422 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -87
10-07 15:17:43.588 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -88
10-07 15:17:44.751 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -88
10-07 15:17:45.924 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -86
10-07 15:17:47.114 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -83
10-07 15:17:48.264 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -82
10-07 15:17:49.409 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -82
10-07 15:17:50.612 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -88
10-07 15:17:51.781 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -79
10-07 15:17:52.913 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -79
10-07 15:17:54.122 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -82
10-07 15:17:55.296 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -84
10-07 15:17:56.441 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -89
10-07 15:17:57.631 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -75
10-07 15:17:58.782 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -63
10-07 15:17:59.924 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -71
10-07 15:18:01.098 D/RangingActivity(16630): Beacon found in ranging cycle.  rssi: -72

关于android - Altbeacon 库测距只有 30% 的时间检测到信标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26135337/

有关android - Altbeacon 库测距只有 30% 的时间检测到信标的更多相关文章

  1. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  2. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  3. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  4. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  5. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  6. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  7. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  8. ruby-on-rails - 只有当不是 nil 时才执行映射? - 2

    如果names为nil,则以下中断。我怎样才能让这个map只有在它不是nil时才执行?self.topics=names.split(",").mapdo|n|Topic.where(name:n.strip).first_or_create!end 最佳答案 其他几个选项:选项1(在其上执行map时检查split的结果):names_list=names.try(:split,",")self.topics=names_list.mapdo|n|Topic.where(name:n.strip).first_or_create!e

  9. ruby - 以毫秒为单位获取当前系统时间 - 2

    在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:

  10. ruby - 检测由 RSpec、Ruby 运行的代码 - 2

    我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题

随机推荐