在特定距离为特定信标触发特定事件

x8diyxa7  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(192)

我在使用多个信标来执行为特定距离的特定信标生成特定事件的应用程序时遇到了几个问题。
问题是,我当前的代码没有区分信标,因为在不到两米处检测到的最后一个信标就是触发事件的信标。
如果我距离信标2不到两米,信标1距离6米,最后检测到的信标是1(因为他们是随机进入DidRangeBeanConsinRegion的),它会通过设置信标2的距离触发信标1事件,尽管距离是10米,这是没有意义的!!!!
我还注意到,无论我把每个信标放在哪里,我的信标都有相同的距离,我想知道这是因为它们都有相同的uuid,这链接了算法,还是我必须为每个信标定义一个区域是一个问题(目前我只为所有信标定义一个区域)
我的问题是我的信标都有相同的uuid,我只能通过mac地址来区分它们,我不知道这是否真的是问题所在,或者我可能需要为每个信标定义一个区域,所以如果我有20个信标,我需要定义20个不同的区域。问题是我不能这样做,因为区域是由uuid过滤的,并且我的所有信标都有相同的uuid。
我不太了解区域和它们的uuid是如何工作的,因为真正有uuid的是我的信标,我很忙。
这是我的密码:

beaconManager.addRangeNotifier(new RangeNotifier() {
            @Override
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {

                for(Beacon oneBeacon : beacons){
                    d=oneBeacon.getDistance();

                    Log.d("FUERADERANGO", " BEACONMAC:" + oneBeacon.getBluetoothAddress() + " distance: " + oneBeacon.getDistance() );

                    if (d<2.0){
                        d=oneBeacon.getDistance();

                        if(oneBeacon.getBluetoothAddress().equals("54:6C:0E:2B:C7:68")){//beacon 1
                            Log.d(TAG, " BEACON1 CON MAC:" + oneBeacon.getBluetoothAddress() + "DETECTADO!!" );
                            Toast.makeText(MainActivity.this,"Beacon1 Encontrado!",Toast.LENGTH_LONG).show();
                        } else if(oneBeacon.getBluetoothAddress().equals("58:93:D8:DE:F3:63")){//beacon 2
                            Log.d(TAG, " BEACON2 CON MAC:" + oneBeacon.getBluetoothAddress() + "DETECTADO!!" );
                            Toast.makeText(MainActivity.this,"Beacon2 Encontrado!",Toast.LENGTH_LONG).show();
                        }

                    }

//                    try {
//                        Thread.sleep(10000);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }

                }

            }
        });
        try {
            beaconManager.startMonitoringBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
        } catch (RemoteException e) {
            e.printStackTrace();
        }

如果有人知道如何正确的程序,使信标不“打扰”对方,并能够分配一个特定的事件,每个人在一个特定的距离,我将不胜感激。
我认为错误可能是:
-每个信标需要一个唯一的uuid-每个信标需要一个唯一的区域-无法定义区域或距离捕获过程
他们给我的距离参数对于共享uuid的两个信标是相同的,不管我把它们放在哪里,最后一个访问didRangeBeaconsisnRegion()的信标会更新这两个信标的距离。
我已尝试按如下方式保存距离1和距离2:

d1=50.0; //I initialize the variables outside of "didRangeBeaconsInRegion ()" so that if it is not updated by its corresponding beacon, it does not point to null and the program crashes
                    d2=50.0;

                    if(oneBeacon.getBluetoothAddress().equals("54:6C:0E:2B:C7:68")) {
                        d1=oneBeacon.getDistance();
                    }

                    if(oneBeacon.getBluetoothAddress().equals("58:93:D8:DE:F3:63")) {
                        d2=oneBeacon.getDistance();
                    }

                    if(oneBeacon.getBluetoothAddress().equals("54:6C:0E:2B:C7:68") && d1<2.0) {
                        Log.d(TAG, " BEACON1 WITH MAC:" + oneBeacon.getBluetoothAddress() + "DETECTED!!" ); //event 1
                    }

                    if(oneBeacon.getBluetoothAddress().equals("58:93:D8:DE:F3:63") && d2<2.0) {
                        Log.d(TAG, " BEACON2 WITH MAC:" + oneBeacon.getBluetoothAddress() + "DETECTED!!" ); //event 1
                    }

但是它也不起作用,两个信标总是更新相同的距离,尽管它们的距离非常不同,就好像它们是一个信标,尽管它们是两个具有相同uuid但不同mac的信标。我不明白,这没道理。
这是一个非常突出的问题,我已经没有什么想法了。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题