¿ Возможно ли инициировать событие beacon через его MAC-адрес с использованием библиотеки Android Beacon, если у меня один и тот же UUID для каждого beacon?

#android #ibeacon #ibeacon-android

#Android #ibeacon #ibeacon-android

Вопрос:

Я разрабатываю приложение музейного типа, которое при обнаружении маяка на определенном расстоянии от интересующей точки показывает мне соответствующую информацию об этом.

Моя проблема в том, что все мои маяки по умолчанию поставляются с одним и тем же UUID, поэтому у меня нет способа отличить их с помощью:

 if (beacon.getId1().toString().equals("iBeacon UUID here"){}
  

поскольку, как говорится в библиотеке estimote, существует только три способа ранжирования маяка в регионе (https://community.estimote.com/hc/en-us/articles/203776266-What-is-a-beacon-region —):

1. Только с UUID: он состоит из всех маяков с заданным UUID. Например: регион, определенный с UUID Estimote по умолчанию, будет состоять из всех маяков Estimote с неизменным UUID.

2. С UUID и Major: он состоит из всех маяков, использующих определенную комбинацию UUID и Major. Например, все маяки Estimote с UUID по умолчанию и основным значением 13579.

3. С UUID, основным и второстепенным: он состоит только из одного маяка (облако Estimote предотвращает наличие двух маяков с одинаковыми идентификаторами). Например, с UUID Estimote по умолчанию, основным значением которого является 13579, а второстепенным — 2468.

У меня была идея использовать следующий экземпляр:

 if(beacon.getBluetoothAddress().equals("iBeacon UUID here")){}
  

вместо указанного выше.

Но результат использования этого экземпляра отрицательный, и маяки не обнаруживаются правильно, если я использую функцию «getBluetoothAddress()».

Это пример кода, использующего «beacon.getId1().toString().equals»:

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

                  String current=" ";
                 //EditText editText = (EditText)RangingActivity.this.findViewById(R.id.rangingText);
                 Beacon firstBeacon = beacons.iterator().next();
                  Log.e(TAG,firstBeacon.toString());
                  String x =firstBeacon.getId1().toString();
                  Double d=firstBeacon.getDistance();
                 // x=x.substring(24);
                 Log.e("Ranging","The first beacon "   firstBeacon.getId1().toString()   " is about "   firstBeacon.getDistance()   " meters away.");

                  if(x.equals("00112233-4455-6677-8899-aabbccddeeff") amp;amp; k1!=1 amp;amp; d< 5.0)
                  {
                      x = current;
                          monolisa_fragment fragment = new monolisa_fragment();
                          getFragmentManager().beginTransaction().replace(R.id.framelayout, fragment).commit();

                      k2=0;k3=0;k4=0;k1=1;

                  }

                  else if(x.equals("00112233-4455-6677-8899-aabbccddeeff") amp;amp; k2!=1 amp;amp; d< 5.0)
                  {
                      Log.e("Sure",x.toString());
                      kohinoor fragment=new kohinoor();
                      getFragmentManager().beginTransaction().replace(R.id.framelayout,fragment).commit();
                      k1=0;k3=0;k4=0;k2=1;

                  }

                  else if(x.equals("00112233-4455-6677-8899-aabbccddeeff") amp;amp; k3!=1 amp;amp; d< 5.0){
                      allanhills fragment =new allanhills();
                      getFragmentManager().beginTransaction().replace(R.id.framelayout,fragment).commit();
                      k1=0;k2=0;k3=1;k4=0;
                  }

              }
           }

        });

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

но я не могу использовать «beacon.getId1().toString().equals», потому что мои маяки UIID имеют один и тот же UUID. И я не могу использовать «getBluetoothAddress ()», потому что сбой и потому, что, как говорит библиотека estimote, мне нужен UUID каждого маяка, но в моем случае у каждого маяка один и тот же UUID.

заранее спасибо.

Ответ №1:

Да, это возможно сделать.

Две точки:

  1. Обычно каждый маяк имеет один и тот же UUID, но для основного и второстепенного (также известных как ID2 и ID3) могут различаться. Вы могли бы рассмотреть возможность различения их по этим полям, если они разные. Это стандартная практика.

  2. Если вы по какой-либо причине не можете этого сделать, вы можете использовать MAC-адрес для различения ваших маяков. Просто установите Beacon.setHardwareEqualityEnforced(true) . Это приведет к тому, что вы получите несколько обнаружений для идентичного идентификатора, если MAC-адрес отличается.

Когда дело доходит до поиска маяков по MAC-адресу, вам нужно будет использовать ранжирующие API, подобные этому:

 Beacon.setHardwareEqualityEnforced(true);
Region region = Region("all-beacons-matching-uuid", "2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6", null, null); // Replace with your UUID
beaconManager.startRangingBeaconsInRegion(region)
  

Если вы хотите обнаружить только один маяк с определенным MAC-адресом, вы можете сделать это следующим образом:

 Beacon.setHardwareEqualityEnforced(true);
Region region = Region("only-one-beacon-matched-by-mac", "00:11:22:33:44:55"); // replace with your beacon's MAC address
beaconManager.startRangingBeaconsInRegion(region)
  

Затем прочитайте MAC следующим образом:

 public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
  for (Beacon beacon: beacons) {
     if (beacon.getHardwareAddress().equals("00:11:22:33:44:55") {
        Log.d(TAG, "This is the beacon I am looking for.");
     }
  }
}
  

Для этого вам нужно знать MAC-адрес каждого из ваших маяков. Для этого вы можете использовать готовый сканер, такой как мой BeaconScope.

Комментарии:

1. Спасибо за ответ, Дэвид. Я чрезвычайно благодарен за возможность использовать вашу библиотеку Android beacon с открытым исходным кодом. Мне действительно не хватало этого, что вы объяснили мне, чтобы знать, как решить мою проблему, поскольку и UUID, и значения major и minor одинаковы в моих маяках, и единственными данными, которые их различают, является MAC-адрес. Я попытаюсь сделать это указанным вами способом и проведу серию тестов, а позже опубликую результаты здесь. Повторяю, я чрезвычайно благодарен как за ваш ответ, так и за вашу работу над маяками. Сердечное приветствие. С уважением

2. Привет! Я проводил тесты, и действительно, это правильный способ реализовать это, используя mac-адрес маяков. Мне не хватало строки кода «Beacon.sethardwarequalityenforced (true);» Это было для того, чтобы использовать его и начать работать. Я очень благодарен за помощь, я не могу поддержать этот ответ, потому что моя репутация меньше 15, но это решение, которое решает мою проблему.

3. Рад, что это помогло. Вы должны иметь возможность установить флажок, чтобы принять ответ, даже если вы не можете проголосовать. Это поможет другим, у кого такая же проблема, найти решение.