【问题标题】:How to detect Region Enter/Exit for multiple beacons using AltBeacon android-beacon-library?如何使用 AltBeacon android-beacon-library 检测多个信标的区域进入/退出?
【发布时间】:2014-10-03 02:34:31
【问题描述】:

我正在使用 iBeacon 并使用 AltBeacon 库。

beaconManager.getBeaconParsers()
             .add(new BeaconParser()
             .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));

我希望我的 Android 应用在信标进入和退出可见性时检测并生成事件。 使用库中使用方法的单个信标可以很好地工作。

public void **didEnterRegion**(Region region)

public void **didExitRegion**(Region region) 

我的问题是多个信标同时可见。 我正在尝试维护一个所有信标都可见的数组。 我想在每次信标进入和退出时生成一个事件。 事件应通过其唯一标识符识别生成事件的信标。 我的信标可以使用beacon.getIdentifiers() 或(UUID、Major 和 Minor)来唯一识别

问题是didExitRegion 方法直到所有信标都退出该区域后才会执行。

谁能想到一个简单的方法让我使用 AltBeacon 库实现我的目标?

任何建议将不胜感激。

【问题讨论】:

  • 请问您如何测试信标是否退出该区域?我需要编写一个像您正在编写的程序这样的程序...也许您是否将信标移动到另一个地方并检查didExitRegion 方法是否已运行?谢谢

标签: android ibeacon


【解决方案1】:

两种选择:

  1. 设置不同的区域以仅匹配每个单独的信标,指定其所有标识符,并监控每个信标。您将获得每个区域不同的进入和退出回调。

    Region region1 = new Region("myIdentifier1", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("1"));        
    Region region2 = new Region("myIdentifier2", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("2"));   
    
    beaconManager.startMonitoringBeaconsInRegion(region1);
    beaconManager.startMonitoringBeaconsInRegion(region2);    
    
  2. 启用测距,并将代码放入didRangeBeaconsInRegion 回调中以跟踪单个信标。您可以使用java.util.HashMap 来跟踪所有可见的信标(每个信标的最近一次看到时间的时间戳),然后如果您在五秒钟内没有看到信标,您可以删除来自HashMap 的信标并执行该信标的退出逻辑。

选项 1 非常适合您预先知道其标识符的少量信标。选项 2 涉及更多,但更适合大量信标或您事先不知道它们的标识符。

【讨论】:

  • 请原谅我的无知,但是 myIdentifier1 是什么,应该设置什么?
  • 它只是一个唯一的字符串来识别区域。您可以使用相同的字符串来停止监控。该字符串可以是您想要的任何值,只要它与您构建的任何其他区域不同即可。
  • 这是否意味着我不能只监控proximityUUID 或proximity+major?其他库允许它(iOS 就是这样)
  • 我误解了 API,标识符(id1、id2 和 id3)实际上是 uuid、major 和 minor,如果我传递 null 它允许它们是任何东西。但是顺序很重要……为什么不称它们为 uuid,major 和 minor?主要和次要都是整数 uuid 是字符串 uuid。为什么将它们包装在 Integer 类中?
  • 对不起,我知道名字有点含糊。这有两个原因:(1) 该库用于多种信标类型,而不仅仅是 iBeacons。术语 uuid、major 和 minor 是 iBeacon 特定的。 (2) 该库是开源的,因此我们避免使用任何特定于 iBeacon 等专有技术的术语。它们被包装在一个 Identifier 类中,以隐藏与处理长度不同的多字节标识符相关的复杂性(对于 iBeacon,UUID 是 16 个字节,主要和次要是两个字节)。通常你不需要考虑它。
【解决方案2】:

/***************这个用于估计信标的代码 *****************/

private  final Region ALL_ESTIMOTE_BEACONS_REGION = new Region("beaconall", null, null, null);

private BeaconManager beaconManager;

public  onCreate()
{

    beaconManager.connect(new BeaconManager.ServiceReadyCallback()
    {
        @Override
        public void onServiceReady()
        {
            Log.d("Lalit", "Beacon service Ready");

            beaconManager.startRanging(ALL_ESTIMOTE_BEACONS_REGION);
            beaconManager.startMonitoring(ALL_ESTIMOTE_BEACONS_REGION);
        }
    });
    beaconManager.setRangingListener(new BeaconManager.RangingListener() {
        @Override
        public void onBeaconsDiscovered(Region region, final List<Beacon> beacons) {

            int index = beacons.size();
            // UUID uuid = UUID.fromString("");
            if (beacons.size() > 0) {
                Beacon SelectedBeacon = beacons.get(index-1);

                Log.d("Lalit", "Beacon Id :- " + SelectedBeacon.getProximityUUID());
                Log.d("Lalit", "Beacon major :- " + SelectedBeacon.getMajor());
                Log.d("Lalit", "Beacon miner :- " + SelectedBeacon.getMinor());
                Log.d("Lalit", "Beacon total :- " + beacons.size());
                Log.d("Lalit","Distance :- "+ getDistance(SelectedBeacon.getRssi(),SelectedBeacon.getMeasuredPower()));
            }

        }
    });

    beaconManager.setMonitoringListener(new BeaconManager.MonitoringListener() {
        @Override
        public void onEnteredRegion(Region region, List<Beacon> list) {
            Calendar calendar = Calendar.getInstance();
            Date entertime = calendar.getTime();
            Log.d("Lalit", "Region Enter :- " + entertime);
            Log.d("List", "Region  UUID id :- " + region.getProximityUUID());
        }

        @Override
        public void onExitedRegion(Region region) {
            Calendar calendar = Calendar.getInstance();
            Date entertime = calendar.getTime();
            Log.d("Lalit", "Region exit :- " + entertime);
            Log.d("List", "Region  UUID id :- " + region.getProximityUUID());
        }
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多