Altbeacon 2.16.1 не может сканировать маяки с определенным кодом типа маяка

#android #bluetooth-lowenergy #beacon #altbeacon

#Android #bluetooth -низкое энергопотребление #маяк #altbeacon

Вопрос:

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

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

Я знаю, что была проблема, из-за которой был исправлен сбой Samsung screen off при сканировании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:

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

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

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

  2. Для любого макета маяка, который будет соответствовать этим фильтрам, вы должны установить идентификаторы производителя hardware assist. По умолчанию библиотека включает 0x0118 (Radius Networks для 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 более интуитивно понятным, чтобы другие люди не сталкивались с той же проблемой, что и вы.

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

1. Спасибо за совет! В моем случае 0x4106 является производителем, но также и кодом типа маяка. Теперь все работает после установки кода производителя из BeaconParser.