Інтеграція з обладнанням: BLE, NFC, IoT та HomeKit в мобільних додатках
Коли завдання — з'єднати смартфон з фізичним пристроєм, половина проблем знаходиться не у коді, а у прошивці обладнання, характеристиках BLE-сервісів та затримках протоколу. Мобільний розробник працює тут на перетині з командою прошивки, і без розуміння стека знизу вверх результат непередбачуваний.
BLE: Де Зазвичай Все Ламається
Bluetooth Low Energy — основний протокол для носимих пристроїв, медичних приладів, розумних замків та промислових датчиків. Core Bluetooth на iOS та BluetoothGatt на Android реалізують одну специфікацію, але поводяться по-різному в граничних випадках.
Найболючіша точка — управління підключенням. На iOS CBCentralManager потребує збереження посилання на весь час сесії; якщо об'єкт знищується, з'єднання закривається мовчки. На Android BluetoothGatt потрібно явно викликати gatt.disconnect() та gatt.close() окремо — тільки close() без disconnect() залишає пристрій у стані «зайнятий» і наступне підключення падає з помилкою 133 (GATT_ERROR). Помилка 133 — найчастіша в розробці Android BLE, і це не «щось пішло не так», а конкретний випадок переповнення черги GATT або неправильного закриття попередньої сесії.
Сканування також нетривіально. На Android 12+ BLUETOOTH_SCAN потребує прапорця neverForLocation якщо вам не потрібна геолокація — без нього користувач бачить запит дозволу на місцезнаходження при підключенні до замка, що викликає збентеження. На iOS з iOS 13 NSBluetoothAlwaysUsageDescription обов'язковий у Info.plist, і додаток мовчки не буде сканувати без нього — без краху, без логу.
Для надійної роботи в production використовуємо чергу операцій над GATT: write, read, notification subscribe — суворо послідовно через операційну чергу, інакше при конкурентних запитах характеристики повертають помилку ATT_INSUFFICIENT_RESOURCES.
NFC: CoreNFC та Android NFC API
iOS підтримує NFC-читання через CoreNFC з iOS 11, запис — з iOS 13. Важливе обмеження: сесія сканування активна тільки поки живий об'єкт NFCNDEFReaderSession і показує системний UI. Фонове сканування доступно тільки для додатків з entitlement com.apple.developer.nfc.readersession.formats і тільки для ISO 14443 (банківські карти, паспорти) — і цей entitlement видається не всім.
На Android все простіше: NfcAdapter.enableForegroundDispatch() ловить теги на передньому плані без системного UI. Фоновий запуск додатку за NFC-тегом реалізується через intent-filter з ACTION_NDEF_DISCOVERED.
HomeKit та Matter
HomeKit — екосистема Apple для розумного дому. Для інтеграції пристрій повинен мати MFi-сертифікацію (або працювати через Software Authentication для Matter). Мобільний додаток використовує HomeKit фреймворк: HMHomeManager → HMHome → HMRoom → HMAccessory → HMService → HMCharacteristic.
Matter (раніше CHIP) — кроссплатформний стандарт, який підтримують Apple, Google, Amazon та Samsung. На iOS пристрої Matter додаються через MTRDeviceController, на Android — через Google Home SDK або Matter SDK безпосередньо. Переважна сторона Matter: один пристрій працює з HomeKit, Google Home та Alexa без перепрошивки.
Для Flutter та React Native використовуємо flutter_blue_plus та react-native-ble-plx відповідно — обидва активно підтримуються і покривають 90% сценаріїв, але для роботи з GATT-нотифікаціями в background на Android все одно потрібен foreground service.
Як Ми Організуємо Роботу
Процес починається з отримання специфікації BLE GATT (список сервісів, характеристик, формати даних) або HCI-логу від команди прошивки. Без цього розробка перетворюється на реверс-інженірію через nRF Connect або Wireshark over HCI.
Тестуємо на реальних пристроях з першого дня — емулятор BLE в симуляторах не відтворює edge cases переприєднання, втрати сигналу, змін MTU.
Терміни: просту інтеграцію з одним BLE-периферійним пристроєм (показання + команди управління) — 2-4 тижні. Повноцінний IoT-додаток з кількома типами пристроїв, firmware OTA-оновленнями та HomeKit-підтримкою — від 2 місяців.







