Altbeacon 2.16.1 не может сканировать маяки с определенным кодом типа маяка - PullRequest
1 голос
/ 07 марта 2019

Я создаю приложение для Android, которое сканирует два типа маяка с помощью библиотеки android-beacon-library:

  • Тип iBeacon (0x4c000215)
  • пользовательский маяк с кодом типа маяка 0x4106

Я знаю, что была проблема, которая исправляла сломанный экран Samsung при сканировании https://github.com/AltBeacon/android-beacon-library/pull/798.
Это исправление было включено в выпуск 2.15.3.
С тех пор во время каждого сканирования на устройстве Samsung> = Android 8.0 я не вижу ни одного из моих пользовательских маяков, но получаю другие типы маяков, такие как iBeacon. Так что я все еще использую релиз 2.15.2.

Вот мой пользовательский макет маяка:

"m:0-1=4106,i:2-3,i:4-4,i:5-6,i:7-8,i:9-10,i:11-11,i:12-12,i:13-13,i:14-14,i:15-15,i:16-16,i:17-17,i:18-23,p:24-24"  

Я проверил код из библиотеки и вижу фильтр, который применяется только для устройств Samsung:

if (Build.MANUFACTURER.equalsIgnoreCase("samsung")) {
  // On the Samsung Galaxy Note 8.1, scans are blocked with screen off when the
  // scan filter is empty (wildcard).  We do a more detailed filter on Samsung only
  // because it might block detections of AltBeacon packets with non-standard
  // manufacturer codes.  See #769 for details.
  filters = new ScanFilterUtils().createScanFiltersForBeaconParsers( 
  mBeaconManager.getBeaconParsers());
}

Если я удаляю этот код, все работает, как я ожидаю.

Что мне нужно сделать, чтобы мне не нужно было редактировать библиотеку?

Спасибо.

1 Ответ

0 голосов
/ 07 марта 2019

Библиотека использует идентификатор производителя BLE и код типа маяка для соответствия фильтрам BLE, когда приложение находится в фоновом режиме.Чтобы это работало, вы должны установить их правильно, иначе фильтры не будут совпадать.

Здесь есть две проблемы:

  1. Ваш код типа маяка не должен включатьBLE ID производителя.Вместо 0x4c000215 используйте 0x0215 (Примечание: 0x4c00 является идентификатором производителя Apple BLE и будет применяться отдельно.) Если вы используете строку макета маяка с этим, вы должны отрегулировать смещения байтов, чтобы учесть это, поэтому ваш макет начинается с m:2-3 = 0215

  2. Для любого расположения маяка, который будет соответствовать этим фильтрам, вы должны установить идентификаторы производителя аппаратной помощи.По умолчанию библиотека включает в себя 0x0118 (сети Radius для AltBeacon) и 0x0215 (Apple для iBeacon) для всех типов маяков других производителей.Для любого пользовательского маяка, который использует еще один код производителя (см. Список здесь: https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers), необходимо добавить его следующим образом (пример показан для идентификатора производителя оборудования 0x1234):

    beaconParser.setHardwareAssistManufacturerCodes(new int[]{0x1234});

Важный совет: Мобильные устройства имеют ограниченное количество слотов аппаратного фильтра Bluetooth. Вы можете убедиться, что вы не исчерпали их, выполнив:

  1. Только регистрациястолько макетов маяков, сколько вам нужно. Если вы не используете макет AltBeacon по умолчанию, позвоните beaconManager.getBeaconParsers().clear();, чтобы удалить его.

  2. Зарегистрируйте только точные коды производителей оборудования, которые вам нужны, в каждом BeaconParser.если вы зарегистрируете более одного, вы будете использовать более одного слота фильтра.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...