Как заставить приложение Android обнаруживать сигнал Eddystone?

Имею в виду https://github.com/AltBeacon/android-beacon-library-reference для моего проекта.

Из документации и некоторых комментариев я понял, что они по умолчанию получают сигнал altBeacon. Я хотел знать, как мы можем персонализировать его для чтения других форматов маяков, таких как Eddystone и iBeacon.

Поскольку это открытый исходный код, я хотел бы придерживаться его, а затем соответствующим образом персонализировать (обновить).

Например, нам нужно установить макет маяка, используя следующий код:

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

Изменить: я изменил часть кода setBeaconLayout, как было предложено в ответе. Тем не менее это не работает.

Я использовал следующий фрагмент кода (имеется в виду https://github.com/AltBeacon/android-beacon-library-reference). Я добавил эти части setBeaconLayout для приема сигнала Eddystone, который, к сожалению, я не получаю. Но если я удалю то же самое, я могу получать сигналы altBeacon.

 public void onCreate() {
    super.onCreate();
    BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
    beaconManager.getBeaconParsers().clear();
    beaconManager.getBeaconParsers().add(new BeaconParser().
    setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT)); //for Eddystone... 
    Log.d(TAG, "setting up background monitoring for beacons and power saving");
    Region region = new Region("backgroundRegion",null, null, null);
    regionBootstrap = new RegionBootstrap(this, region);
    backgroundPowerSaver = new BackgroundPowerSaver(this);
}

Может ли кто-нибудь помочь мне в этом? Как мне заставить мое приложение получать сигнал Eddystone?

P.s Может ли кто-нибудь также дать список образцов setBeaconLayout части для разных сигналов. Я предполагаю, что если мы просто изменим эту часть, мы сможем получать сигналы (для формата сигнала, для которого мы установили layout.

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


person driftking9987    schedule 14.11.2015    source источник


Ответы (3)


В версии 2.6 библиотеки Android Beacon Library, используемой в эталонном приложении по состоянию на 15 ноября 2015 года, была ошибка. Эта ошибка не позволяла обнаруживать маяки Eddystone с использованием спецификации региона по умолчанию. с тремя нулевыми идентификаторами.

Эта ошибка была исправлена в версии 2.6.1 библиотеки. Я обновил эталонное приложение для использования версии 2.7 от 16 ноября 2015 г., которая включает в себя исправление этой ошибки.

Простое решение состоит в том, чтобы использовать последнюю копию эталонного приложения или изменить копию, из которой нужно изменить строку:

compile 'org.altbeacon:android-beacon-library:2.6@aar'

to

compile 'org.altbeacon:android-beacon-library:2.7@aar'
person davidgyoung    schedule 16.11.2015
comment
Спасибо. Теперь я могу обнаружить UID eddystone. Спасибо за исправление ошибки, но не могли бы вы уточнить, в чем именно была проблема? Из этих трех идентификаторов один можно использовать для обнаружения конкретных маяков, влияет ли на это обновление? Большое спасибо. - person driftking9987; 17.11.2015
comment
Из-за ошибки Region действительно соответствовал Beacon, если у него было меньше идентификаторов. Область подстановочных знаков по умолчанию имеет три нулевых идентификатора, а Eddystone-UID — только 2. Описание изменения находится в первом пункте примечаний к выпуску 2.6.1: github.com/AltBeacon/android-beacon-library/releases/tag/2.6.1 Это исправленная фиксация ошибка: github.com/AltBeacon/android-beacon-library/commit/ И это коммит, вызвавший ошибку: github.com/AltBeacon /android-beacon-library/commit/ - person davidgyoung; 17.11.2015

Недавно я изо всех сил пытался добиться того же и нашел для него решение android-pla">здесь. Также вам необходимо настроить маяк, переведя его в режим Eddystone UUID. Просто изменив setBeaconLayout, мы не сможем обнаружить другой формат маяка. Например, формат UID Eddystone не совпадает с форматом UID iBeacon. Вы можете исследовать различные форматы маяков, используя что-то вроде mBeaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));.

Итак, ваш код должен выглядеть так:

public class MyApplication extends Application implements BootstrapNotifier {
private static final String TAG = "MyApplication";
private RegionBootstrap regionBootstrap;
private BackgroundPowerSaver backgroundPowerSaver;
private BeaconManager mBeaconManager;

public void onCreate() {
    super.onCreate();
    mBeaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this);
    mBeaconManager.getBeaconParsers().clear();
     mBeaconManager.getBeaconParsers().add(new BeaconParser().
        setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));
    Region region = new Region("my-beacon-region", null, null, null);

    regionBootstrap = new RegionBootstrap(this, region);

    backgroundPowerSaver = new BackgroundPowerSaver(this);
}

@Override
public void didEnterRegion(Region region) {

        Log.d("radbeacon", "Beacon detected in region");
}

@Override
public void didExitRegion(Region region) {

    Log.d("radbeacon", "Beacon out of region");
}

@Override
public void didDetermineStateForRegion(int i, Region region) {
      //Ignore
    }

}

Также не забудьте перевести маяк в режим Eddystone UID, а затем включить маяк, чтобы ваше приложение могло его обнаружить.

person Parag Kadam    schedule 14.11.2015
comment
Я пытался добавить BeaconParser.EDDYSTONE_UID_LAYOUT, но это мне не очень помогает. Я использую приложение locate для отправки сигналов Eddystone, но приложение на самом деле их не получает. И как вы думаете, каким должен быть подход к настройке APP для чтения маяков любого типа. - person driftking9987; 14.11.2015
comment
Перейдите по этой ссылке, чтобы узнать больше о маяках здесь -› youtube.com/watch?v=TZf4WquRGJU - person Parag Kadam; 15.11.2015
comment
Разве нам не нужно mBeaconManager.bind(this); ? Кстати, я пытался добавить это, но это просто не позволяет мне добавить это! И спасибо за видео, прохожу через это. - person driftking9987; 15.11.2015
comment
Я сделал то же самое, но не смог определить формат UID eddytsone. Если я удалю часть setBeaconLayout, я смогу определить формат altBeacon, поскольку он используется по умолчанию. Не могли бы вы сказать, что случилось? - person driftking9987; 15.11.2015
comment
mBeaconManager.bind(this) здесь не требуется, если вы добавите mBeaconManager.bind(this) в свой код, тогда ваш маяк будет обнаружен только тогда, когда это конкретное действие находится на переднем плане. Используя приведенный выше код, вы сможете обнаружить маяк не только на переднем плане, но и в фоновом режиме (когда ваше приложение не запущено). - person Parag Kadam; 15.11.2015
comment
Также какой маяк вы используете и настроили ли вы его в режиме uddystone uid? - person Parag Kadam; 15.11.2015
comment
Я использую приложение для поиска на своем телефоне Android. И да, я где-то читал комментарий Дэвида, что bind() вызывается автоматически, когда мы вызываем RegionBootStrap. И да, я могу обнаружить сигналы altBeacon. Но я не знаю, почему это не работает для формата UID eddystone. - person driftking9987; 15.11.2015

Код выглядит хорошо для меня. Убедитесь, что ваш маяк действительно передает кадр Eddystone-UID. Можете ли вы попробовать приложение Beacon Locate из магазина Google Play? Он основан на той же библиотеке и использует фрагмент кода, аналогичный показанному в вопросе. Я использую это приложение с аналогичным кодом для успешного обнаружения маяков Eddystone-UID.

Если это не сработает, включите низкоуровневую отладку в своем приложении, вызвав mBeaconManager.setDebug(true), и вставьте вывод LogCat, который выглядит примерно так:

D/BeaconParser﹕ This is not a matching Beacon advertisement. (Was expecting be ac. The bytes I see are: 0201061aff4c0002153d9d4c66fb0f11e3ab64c82a143314d68079186cb61c09426c756542617220426561636f6e20383833333134453537383038000000

Это сообщит нам, сколько байтов фактически передает маяк, чтобы мы могли видеть, находится ли он в формате Eddystone-UID.

РЕДАКТИРОВАТЬ: похоже, проблема была связана с ошибкой в ​​версии Android Beacon Library, которая поставлялась в комплекте с эталонным приложением до 15 ноября 2015 года. Подробнее см. в другом моем ответе.

person davidgyoung    schedule 16.11.2015
comment
Я использую приложение Beacon Locate для целей тестирования. Если я сделаю базовую RangingActivity (только ваш образец) public void onResume() { super.onResume(); mBeaconManager = BeaconManager.getInstanceForApplication(this.getApplicationContext()); // Detect the main Eddystone-UID frame: mBeaconManager.getBeaconParsers().add(new BeaconParser(). setBeaconLayout("s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19")); mBeaconManager.bind(this); }, я смогу обнаружить eddystone uid.. (1/2) - person driftking9987; 16.11.2015
comment
Но если я использую github.com/AltBeacon/android-beacon-library-reference , добавляя только beaconManager.getBeaconParsers().clear(); beaconManager.getBeaconParsers().add(new BeaconParser(). setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT)); в функцию onCreate, оставляя все остальное как есть, только для целей тестирования, я не получаю никакого UID eddystone. Моя главная проблема заключается в том, почему я не могу обнаружить eddystone? Пожалуйста, скажите свое мнение. Спасибо. - person driftking9987; 16.11.2015
comment
Я вижу проблему. Пожалуйста, смотрите мой другой ответ. - person davidgyoung; 17.11.2015