Как определить, какой маяк выходит, уведомление маяка отображается, когда маяк находится вне зоны действия

Я пытаюсь обнаружить устройства маяка, используя свое устройство, и поэтому отслеживаю их, а также прослушиваю уведомления о диапазоне.

Я использую эту библиотеку и приложение-справочник по библиотеке. Мне удалось прослушать пользовательский маяк, используя метод настройки макета маяка.

Шаг 1. Я устанавливаю макет в классе приложения. Шаг 2. Я делаю базовую активность реализующей beaconconsume, где она выполняет ранжирование.

При запуске службы/метода мониторинга диапазона мы используем «myRangeUniqueId», но я думаю, что методы didexit и didenter используют «backgroundId». Почему это так?

Итак, ситуация такова: я перемещаю устройство маяка на несколько метров, но все равно получаю уведомление о маяке, но не вижу маяка. Эти сообщения продолжают меняться попеременно, даже когда маяк находится далеко.

Должен ли я что-то делать, чтобы предотвратить это? Пожалуйста помоги.

фрагменты кода включают ниже:

  1. Класс приложения реализует BootstrapNotifier, а код приведен ниже.

    BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
    beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("LAYOUT_HERE"));
    
    Region region = new Region("backgroundRegion",
            null, null, null);
    regionBootstrap = new RegionBootstrap(this, region);
    
    // simply constructing this class and holding a reference to it in your custom Application
    // class will automatically cause the BeaconLibrary to save battery whenever the application
    // is not visible.  This reduces bluetooth power usage by about 60%
    backgroundPowerSaver = new BackgroundPowerSaver(this);
    
    
    
     @Override
     public void didEnterRegion(Region arg0) {
          // In this example, this class sends a notification to the user whenever a Beacon
         // matching a Region (defined above) are first seen.
        Log.d(TAG, "did enter region.");
        if (!haveDetectedBeaconsSinceBoot) {
            Log.d(TAG, "auto launching MainActivity");
            haveDetectedBeaconsSinceBoot = true;
        } else {
            // i am not sending out any notification here since there could be multiple beacons and i need to identify any one of them with a specific uuid
        }
    
    
    }
    
    
    @Override
    public void didExitRegion(Region region) {
        sendNotification("exited",2);
    }
    

я ничего не делаю в методе didDetermineStateForRegion, он просто переопределяется

  1. У меня есть BaseActivity, который реализует BeaconConsumer

        private BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this);
       @Override
       protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            beaconManager.bind(this);
       }
    
        @Override 
        protected void onDestroy() {
            super.onDestroy();
            beaconManager.unbind(this);
         }
        @Override 
        protected void onPause() {
             super.onPause();
                  if(beaconManager.isBound(this))beaconManager.setBackgroundMode(true);
             }
     @Override 
     protected void onResume() {
         super.onResume();
         if (beaconManager.isBound(this)) beaconManager.setBackgroundMode(false);
      }
    
       @Override
       public void onBeaconServiceConnect() {
          beaconManager.setRangeNotifier(new RangeNotifier() {
             @Override 
             public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
                if (beacons.size() > 0) {
                /*EditText editText = (EditText)RangingActivity.this
                        .findViewById(R.id.rangingText);
                Beacon firstBeacon = beacons.iterator().next();
                logToDisplay("The first beacon "+firstBeacon.toString()+" is about "+firstBeacon.getDistance()+" meters away.");    */
        CommonUtilities.sendNotification(BaseActivity.this,"entered",1);
                        }
                    }
                }
            }
        }
    });
    
    try {
        beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId",null, null, null));
        } catch (RemoteException e) {   }
      }
    

P.S: Когда я перемещаю устройство в другое место, скажем, на расстояние около 5 метров, я получаю случайное уведомление о том, что маяк находится в пределах досягаемости, а затем сразу же получаю уведомление о том, что маяк находится вне досягаемости.

Спасибо


person Rat-a-tat-a-tat Ratatouille    schedule 12.03.2015    source источник


Ответы (1)


Несколько моментов:

  1. Уникальный идентификатор используется в качестве ключа для идентификации Region, чтобы вы могли запускать и останавливать ранжирование и мониторинг. Каждый регион, который вы создаете и регистрируете в системе, должен иметь другой строковый идентификатор, но значение может быть любым, если оно уникально.

  2. Обратный вызов didRangeBeaconsInRegion выполняется каждую секунду, а не только тогда, когда мобильное устройство входит в зону действия маяка.

  3. Если вы получаете повторяющиеся didExitRegion обратные вызовы, когда маяк находится в пределах 20 метров или около того, возможно, ваш маяк не передает достаточно часто. Знание производителя маяка, модели и частоты передачи, а также модели вашего мобильного устройства может помочь решить эту проблему.

person davidgyoung    schedule 12.03.2015
comment
Я изменил новую строку региона на new Region("keyhere",Identifier.parse(uuidhere)),null,null); . Да, маяк находится в пределах 20 метров, поэтому, чтобы предотвратить частые вызовы входа и выхода, я изменил тайм-аут в MonitorState на 20000l вместо 10000l, что, как я знаю, не подходит, и частоту сканирования на 2000l согласно это - person Rat-a-tat-a-tat Ratatouille; 12.03.2015
comment
Мы используем апрельский маяк, боюсь, я не знаю частоту передачи :(. - person Rat-a-tat-a-tat Ratatouille; 12.03.2015
comment
В случае, если апрельский маяк передает на частоте ‹ 1 Гц, вы можете попробовать уменьшить частоту сканирования, чтобы увидеть, прекращаются ли вызовы didExitRegion. Следующий код уменьшает частоту сканирования на переднем плане до 30 секунд с 1,1 секунды по умолчанию: beaconManager.setForegroundScanPeriod(30000l); - person davidgyoung; 12.03.2015
comment
привет, сэр, я уменьшил частоту сканирования до 2000, и я проверил это, если вообще поступит вызов на выход, я мог бы попробовать и 30 секунд. Но повлияет ли это на то, как обнаруживаются маяки? - person Rat-a-tat-a-tat Ratatouille; 13.03.2015
comment
но я даже увеличил период ожидания с 10 до 20 секунд. Я делаю это правильно? - person Rat-a-tat-a-tat Ratatouille; 13.03.2015
comment
Да, это повлияет на частоту обратных вызовов ранжирования, если вы установите его успешно. Убедитесь, что вы добавили эту строку, прежде чем настраивать свой RegionBootstrap. - person davidgyoung; 13.03.2015
comment
сэр, да, именно здесь я указал время сканирования (передний план)... я помечаю это как ответ :). И +1 за все ваше время.. Если что, я вам отвечу.. - person Rat-a-tat-a-tat Ratatouille; 17.03.2015