Інтеграція CoAP-протоколу для IoT-пристроїв у мобільному додатку
CoAP (Constrained Application Protocol, RFC 7252) — це HTTP для мікроконтролерів. Семантика та сама: GET, POST, PUT, DELETE, коди відповідей як у HTTP (2.05 Content = 200, 4.04 Not Found = 404), URL-ресурси. Але працює поверх UDP, а не TCP, займає десятки байтів замість сотень, і розроблений для пристроїв з 10 КБ RAM і CR2032 живленням.
Мобільний додаток, який спілкується з такими пристроями безпосередньо або через CoAP-proxy — нішеве, але зростаюче поле. Thread-мережі (Matter-стандартний розумний дім), промислові датчики, медичні носимі пристрої — там CoAP.
UDP і втрати пакетів: як CoAP вирішує надійність
CoAP визначає два типи повідомлень:
-
CON (Confirmable) — відправник чекає
ACK. При відсутності — exponential backoff і повтор (по замовчуванню: 2 спроби, інтервал 2–32 секунди). Аналог TCP-гарантій. - NON (Non-confirmable) — fire and forget. Для телеметрії з високою частотою оновлення.
Кожне CON-повідомлення несе Message ID (2 байти) для дедупліки — одержувач кешує останні оброблені ID і ігнорує повторення. Строк зберігання в кеші — EXCHANGE_LIFETIME (247 секунд по RFC). При роботі через NAT mobile → IoT-мережу врахуйте, що NAT binding теж має timeout (~30 секунд для UDP через багато carrier NAT).
Observe: підписка на ресурс без поллінгу
RFC 7641 додає Observe option — аналог WebSocket subscription для CoAP. Клієнт відправляє GET /sensor/temperature з Observe: 0 (subscribe). Сервер відправляє поточне значення й потім сповіщення при кожній зміні. Observe: 1 — відписка.
Це ключова фіча для мобільного IoT-клієнта: замість поллінгу кожні 5 секунд — один запит, серверні push'и. Обмеження: по RFC сервер ведучи список спостерігачів. При смені IP клієнта (мобільний інтернет, Wi-Fi → 4G) сервер не знає про зміну — потрібно повторно реєструвати Observe з нової адреси.
На практиці: при кожній смені мережі (визначаємо через ConnectivityManager.NetworkCallback на Android, NWPathMonitor на iOS) — перевідправляємо всі активні Observe-запити.
DTLS: безпека поверх UDP
CoAP без шифрування — небезпечен для production. DTLS (Datagram TLS, RFC 6347) — TLS-аналог для UDP. Handshake важчий за TCP TLS (4–6 RTT проти 1–2 для TLS 1.3), що критично для пристроїв з повільними процесорами.
Профілі безпеки CoAP:
- NoSec — без шифрування. Тільки для ізольованих мереж.
- PreSharedKey (PSK) — симетричний ключ, прошитий в пристрій на фабриці. Найпоширеніший у промислових сценаріях.
- RawPublicKey — без PKI-інфраструктури, але з публічними ключами.
- Certificate — повноцінна PKI. Рідко на constrained-пристроях.
Для мобільного клієнта, який підключається до PSK-пристроїв: безпечно зберігайте PSK-ключі (Keychain / EncryptedSharedPreferences) та реалізуйте DTLS-handshake через бібліотеку з PSK-підтримкою.
Клієнтські бібліотеки для мобіля
CoAP-бібліотек для мобіля значно менше, ніж MQTT. Реальні варіанти:
| Платформа | Бібліотека | DTLS | Observe |
|---|---|---|---|
| Android | Californium (Eclipse) | + (via Scandium) | + |
| iOS | libcoap (C, via FFI) | + | + |
| Flutter | coap (pub.dev) | частково | + |
| React Native | немає готового | — | — |
Для React Native єдиний робочий шлях — нативний модуль (Californium на Android, libcoap на iOS через Objective-C bridge) або CoAP-to-HTTP proxy на бекенді.
Californium (org.eclipse.californium:californium-core) — найзрілішша реалізація. Observe через CoapClient.observe() з CoapHandler. DTLS через окремий scandium артефакт. Приклад ініціалізації PSK-з'єднання:
DtlsConnectorConfig config = new DtlsConnectorConfig.Builder()
.setPskStore(new StaticPskStore("device-id", pskBytes))
.build();
DTLSConnector connector = new DTLSConnector(config);
CoapEndpoint endpoint = new CoapEndpoint.Builder()
.setConnector(connector).build();
CoapClient client = new CoapClient("coaps://192.168.1.100/sensor/temperature");
client.setEndpoint(endpoint);
Для iOS libcoap компілюється через CocoaPods з кастомним podspec або через SPM як binary target (потрібна пересборка під arm64/x86_64). Це не 15-хвилинна задача.
CoAP через CoAP-HTTP proxy
Якщо пристрої в ізольованій IoT-мережі, а мобільний клієнт повинен спілкуватись через інтернет — CoAP-to-HTTP proxy (або CoAP-to-MQTT proxy) знімає складність з мобільної сторони. Eclipse Hono, AWS IoT Core з CoAP endpoint, або самостійно розгорнутий Californium-proxy.
Мобільний клієнт працює через звичайні HTTPS/WebSocket, proxy транслює в CoAP. Втрачаємо прямий Observe (потрібна його емуляція через SSE або WebSocket на рівні proxy), отримуємо простоту клієнтського коду й надійність TCP.
Оцінка та орієнтири
CoAP-інтеграція — нестандартна задача. Орієнтири залежать від сценарію: якщо через proxy — 2–3 тижні. Пряма CoAP з DTLS на нативних платформах — 4–8 тижнів з урахуванням налаштування Californium/libcoap, DTLS-handshake та Observe. Обов'язково уточнюємо профіль безпеки пристроїв та наявність готової мережної інфраструктури перед оцінкою.







