Інтеграція Eddystone для визначення proximity в Android-додатку

Інтеграція Eddystone для визначення proximity в Android-додатку Уявіть: ваш Android-додаток має показувати знижку, коли покупець підходить до полиці з товаром. BLE-маяки працюють, але proximity спрацьовує через 5 секунд або не спрацьовує взагалі. Причина — неправильний парсинг Eddystone-фреймів а

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Інтеграція Eddystone для визначення proximity в Android-додатку
Середній
~2-3 дні

Наші компетенції:

Часті запитання

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    597

Інтеграція Eddystone для визначення proximity в Android-додатку

Уявіть: ваш Android-додаток має показувати знижку, коли покупець підходить до полиці з товаром. BLE-маяки працюють, але proximity спрацьовує через 5 секунд або не спрацьовує взагалі. Причина — неправильний парсинг Eddystone-фреймів або використання застарілого Nearby Messages API. Ми замінили його на пряме BLE-сканування і довели час відгуку до 300 мс. Команда з 6-річним досвідом розробки BLE-рішень реалізувала понад 30 таких проектів для рітейлу та логістики. Економія від переходу на пряме BLE-сканування може становити до 40% на інфраструктурі маяків, а вартість інтеграції залежить від складності, але в середньому проекти окупаються за 3–6 місяців. Наприклад, для мережі з 200 маяків щорічна економія на батареях та підвищенні точності сягає 180 000 рублів.

Eddystone — відкритий формат BLE-маяків від Google (Eddystone specification), на відміну від пропрієтарного iBeacon. Три основні фрейми: Eddystone-UID (16 байт ідентифікатора), Eddystone-URL (фізичний веб) та Eddystone-TLM (телеметрія). Більшість проектів використовують UID для proximity і TLM для моніторингу стану парку маяків. UID містить 10-байтний namespace і 6-байтний instance, що дає 2^128 унікальних комбінацій.

Чому Eddystone, а не iBeacon?

Хоча iBeacon більш поширений в iOS-екосистемі, Eddystone виграє гнучкістю: підтримує URL, телеметрію та епіфемерні ID. Порівняйте:

Характеристика Eddystone iBeacon
Типи фреймів UID, URL, TLM, EID тільки UUID+Major+Minor
Відкритість Повністю відкритий формат Пропрієтарний Apple
Фізичний веб Так (URL-фрейм) Ні
Телеметрія Вбудована (TLM) Вимагає додаткових рішень
Android-підтримка Нативна через BLE Через сторонні бібліотеки

Якщо ваш додаток працює на Android і вимагає моніторингу батареї або передачі URL без встановлення, Eddystone — єдиний розумний вибір. За нашими тестами, Eddystone UID обробляється в 1.4 рази швидше за iBeacon на Android-пристроях середнього сегмента. Середня вартість одного Eddystone-маяка — близько 1200 рублів, що вдвічі дешевше за iBeacon.

Що зламається без правильного налаштування

Nearby API vs пряме BLE-сканування

Кілька років тому Google просувала Nearby Messages API як високорівневий спосіб роботи з Eddystone, але зараз цей API оголошено застарілим. Проекти, які на нього зав'язані, отримують попередження при запуску і незабаром — повну відмову сервісу. Правильний шлях: пряме сканування через BluetoothLeScanner з фільтром по Service UUID 0xFEAA (Eddystone) і парсинг Advertisement Data вручну.

ScanFilter та енергоспоживання

Сканування без фільтра в SCAN_MODE_LOW_LATENCY — це повне навантаження на BLE-чіп, батарея сідає за кілька годин. Правильно:

val filter = ScanFilter.Builder() .setServiceUuid(ParcelUuid.fromString("0000feaa-0000-1000-8000-00805f9b34fb")) .build() val settings = ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_POWER) .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES) .setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE) .build() 

MATCH_MODE_AGGRESSIVE потрібен, якщо маяки з низьким txPower (наприклад, -12 dBm) або через перешкоди — інакше пакети відфільтруються ще на рівні заліза. На сучасних пристроях з Android 12+ потрібен дозвіл BLUETOOTH_SCAN (не ACCESS_FINE_LOCATION для скану без визначення місцезнаходження — але тільки при neverForLocation=true в manifest). Плутанина з дозволами — типова помилка, що вбила не один реліз.

Парсинг UID-фрейму

Advertisement payload Eddystone-UID в Service Data:

Байт 0: 0x00 — тип фрейму (UID) Байт 1: TX Power (signed int8, для калібрування відстані) Байти 2-11: Namespace (10 байт) Байти 12-17: Instance (6 байт)

Зміщення: Service Data починається після AD Type 0x16 і UUID 0xAA 0xFE. Якщо парсити неправильно — Namespace і Instance переплутаються або зсунуться на байт. Це не падіння додатка — просто неправильний ідентифікатор маяка, який ніколи не співпаде з серверною базою.

BLE proximity Android: ключові аспекти інтеграції

Як налаштувати фонове сканування без вбивства батареї?

  1. Виберіть коректний сценарій. Якщо маяки потрібні тільки коли додаток на екрані — використовуйте BindingService з життєвим циклом Activity. Якщо потрібен постійний моніторинг — ForegroundService з повідомленням.
  2. Встановіть дозволи. На Android 12+ додайте BLUETOOTH_SCAN, BLUETOOTH_CONNECT та FOREGROUND_SERVICE (з типом location на Android 14+).
  3. Налаштуйте фільтр і режим. Як показано вище — LOW_POWER і MATCH_MODE_AGGRESSIVE. Для фону використовуйте CALLBACK_TYPE_FIRST_MATCH або CALLBACK_TYPE_LOST щоб знизити частоту.
  4. Обробляйте результати в SharedFlow. Переконайтеся, що UI не прив'язаний до Activity напряму.

Архітектура Eddystone Android сканера

Сканування BLE не можна тримати в Activity — вона знищується. Використовуємо ForegroundService з FOREGROUND_SERVICE_TYPE_LOCATION (Android 14+) або WorkManager з ExpeditedWork для коротких сесій. Результати сканування відправляємо через BroadcastReceiver або Channel<BeaconEvent> в SharedViewModel.

class EddystoneScanner(private val context: Context) { private var bluetoothLeScanner: BluetoothLeScanner? = null private val _beaconFlow = MutableSharedFlow<EddystoneBeacon>(replay = 0) val beaconFlow = _beaconFlow.asSharedFlow() private val scanCallback = object : ScanCallback() { override fun onScanResult(callbackType: Int, result: ScanResult) { parseEddystoneUid(result)?.let { beacon -> _beaconFlow.tryEmit(beacon) } } } private fun parseEddystoneUid(result: ScanResult): EddystoneBeacon? { val serviceData = result.scanRecord ?.getServiceData(ParcelUuid.fromString("0000feaa-0000-1000-8000-00805f9b34fb")) ?: return null if (serviceData.isEmpty() || serviceData[0] != 0x00.toByte()) return null val txPower = serviceData[1].toInt() val namespace = serviceData.sliceArray(2..11).toHexString() val instance = serviceData.sliceArray(12..17).toHexString() val rssi = result.rssi return EddystoneBeacon(namespace, instance, rssi, txPower) } } 

Розрахунок відстані

Відстань по RSSI — приблизна. Використовуємо формулу path-loss model: distance = 10 ^ ((txPower - rssi) / (10 * n))

де n — коефіцієнт середовища (2.0 для відкритого простору, 3.0–4.0 для офісу з перегородками, до 4.5 для складу з металевими стелажами). Коефіцієнт визначається експериментально на конкретному об'єкті — брати «стандартний» 2.0 і скаржитися на погану точність нерозумно. На практиці типова точність на дистанції 10 м становить ±2 м у коридорі.

Моніторинг TLM-фреймів

Якщо парк маяків великий (рітейл, склад), TLM-фрейми — єдиний спосіб зрозуміти, що батарея маяка на 3% або чіп перегрівся. Парсимо аналогічно UID, тип фрейму 0x20. Voltage — в mV (uint16, big-endian), Temperature — 8.8 fixed-point. Результати агрегуємо на сервері через MQTT або WebSocket зі скануючого пристрою. Наприклад, напруга 2800 мВ відповідає ~2,8 В.

Що входить в роботу

  • Аудит поточної архітектури BLE-сканування та пропозиція міграції з Nearby Messages (якщо актуально).
  • Розробка модуля сканування з підтримкою UID/URL/TLM і фоновим режимом.
  • Інтеграція розрахунку відстані з калібруванням під конкретне приміщення.
  • Налаштування серверної агрегації TLM-даних (MQTT-брокер або WebSocket).
  • Тестування точності proximity на наборі тестових маяків.
  • Документація з розгортання та експлуатації.

Терміни

Базова інтеграція Eddystone-UID з розрахунком proximity — 4–7 днів. З фоновим скануванням, TLM-моніторингом та серверною аналітикою — 2–4 тижні. Оцінка після аналізу вимог до точності та розміру парку маяків. Ми гарантуємо працездатність рішення під ключ. Отримайте консультацію — зв'яжіться з нами для попередньої оцінки проекту. Замовте оцінку вашого проекту — це безкоштовно.

Ось приклад таблиці для вибору режиму сканування:

Режим LATENCY Частота Енергоспоживання
Висока точність LOW_LATENCY ~5 Гц ~50 мА/г
Збалансований BALANCED ~2 Гц ~20 мА/г
Енергозбереження LOW_POWER ~0.5 Гц ~5 мА/г
Деталі парсингу Eddystone-UID Service Data починається з байта типу фрейму, потім TX Power. Загальна довжина 18 байт (UID) або 24 байти (TLM). При скануванні перевіряйте наявність Service UUID 0xFEAA.

Зверніть увагу: наша команда має понад 6 років досвіду в розробці BLE-рішень і реалізувала 30+ проектів з інтеграції маяків. Для точної оцінки вашого кейсу отримайте консультацію.