Розробка мобільного додатку для вендингових автоматів
Ми створюємо мобільні додатки для вендингових мереж, які перетворюють звичайний автомат на цифрову точку продажів. З нашим рішенням оператор отримує телеметрію в реальному часі, покупець оплачує товар за QR-кодом без монет, а автомат сам повідомляє про несправності. Оцініть проєкт під вашу мережу — пишіть, ми розповімо деталі.
Вендинговий автомат без мобільного додатку — це купюроприймач і монетоприймач. З додатком: QR-оплата, безготівковий розрахунок, програма лояльності, push-повідомлення про новинки, історія покупок. Для оператора мережі — телеметрія: рівень заповнення, помилки механіки, виручка по точках у реальному часі. Наш досвід: 5+ років розробки вендингового ПЗ, 20+ впроваджених проєктів. Гарантуємо стабільну роботу навіть при перебоях зв'язку.
Як працює QR-оплата у вендингових автоматах?
Для безготівкової оплати з телефона використовується платіжний модуль, вбудований в MDB-шину автомата. Користувач оплачує в додатку — сервер надсилає сигнал модулю, той емулює опускання монети, і автомат видає товар. Сесія QR-оплати генерує унікальний токен з TTL 120 секунд. Якщо користувач не встиг оплатити, QR застаріває, і автомат скидає очікування.
// iOS: генерація QR з session token для автомата
class VendingSessionManager {
func createPaymentSession(machineId: String, amount: Decimal) async throws -> PaymentSession {
let session = try await api.createSession(VendingSessionRequest(
machineId: machineId,
amount: amount,
expiresIn: 120 // 2 хвилини
))
// QR містить session.deepLink — відкриває додаток при скануванні
return session
}
func pollSessionStatus(sessionId: String) -> AsyncStream<SessionStatus> {
AsyncStream { continuation in
Task {
for await _ in Timer.publish(every: 2, on: .main, in: .common).autoconnect().values {
let status = try? await api.getSessionStatus(sessionId)
continuation.yield(status ?? .unknown)
if status == .completed || status == .expired { break }
}
continuation.finish()
}
}
}
}
Polling статусу сесії кожні 2 секунди — простіше WebSocket у даному випадку. Сесія має TTL 120 секунд: якщо користувач не оплатив, QR застарів, автомат скидає очікування. Час відгуку системи становить менше 1 секунди, що критично для high-traffic точок (більше 200 транзакцій на день).
Телеметрія: протокол DEX/UCS та сучасний IoT
Стандарт для вендингових автоматів — протокол DEX/UCS (Data Exchange / Universal Communications Standard). Більшість комерційних автоматів (Crane, Sanden, Azkoyen) мають DEX-порт — RS-232, 9600 бод. Через DEX можна читати лічильники продажів, помилки, залишки товару. Проблема: DEX розроблявся для зчитування даних при обслуговуванні, не для онлайн-моніторингу.
Сучасне рішення: IoT-контролер (Telemetry Gateway) підключається до DEX-порту і до мережі (4G/Wi-Fi). Виробники: Parlance, CPI, Nayax, Coinco. Вони надають REST API для мобільних додатків та дашбордів. Час автономної роботи контролера в режимі очікування досягає 72 годин завдяки енергоефективним компонентам.
Немає стандартного IoT-модуля? Саморобний на Raspberry Pi Zero + RS-232 адаптер + Python-парсер DEX + MQTT публікація:
Приклад коду парсера DEX на Python
import serial, paho.mqtt.client as mqtt
def read_dex_data(port='/dev/ttyUSB0'):
ser = serial.Serial(port, 9600, timeout=5)
# Ініціалізація DEX-сесії
ser.write(b'\x04') # EOT — початок сесії
response = ser.read_until(b'\x04') # читаємо до EOT
return parse_dex_block(response)
def parse_dex_block(data: bytes) -> dict:
# Парсимо блоки VA (Vending Machine Audit)
# VA1 — ідентифікація, VA2 — дані продажів, VA3 — залишки
blocks = data.split(b'\x1c') # FS роздільник
return {block[:3].decode(): block[3:].decode() for block in blocks}
MDB: управління оплатою
MDB (Multi-Drop Bus) — протокол для пристроїв оплати всередині автомата (купюроприймач, монетоприймач, картковий рідер). Більшість сучасних касет працює через MDB Master — головний контролер автомата керує периферією. Детальніше про Multi-Drop Bus (MDB).
Порівняння традиційного автомата та з мобільним додатком
| Параметр |
Традиційний автомат |
Автомат з додатком |
| Спосіб оплати |
Монети, купюри |
QR-код, банківська картка, мобільний гаманець |
| Управління асортиментом |
Вручну при обході |
Дистанційне через дашборд |
| Телеметрія |
Немає |
Залишки, помилки, виручка в реальному часі |
| Програма лояльності |
Неможлива |
Історія покупок, знижки, push-повідомлення |
| Зниження витрат на інкасацію |
База |
До 50% |
Що входить в розробку мобільного додатку для вендингу
Ми надаємо:
- Клієнтський додаток (iOS/Android) з QR-оплатою, історією, лояльністю.
- Операторський дашборд з телеметрією, управлінням автоматами, аналітикою.
- Інтеграцію з платіжними модулями (Nayax, PayLink) через MDB.
- Підключення IoT-контролерів для читання DEX/UCS.
- Документацію та навчання персоналу.
- Підтримку після запуску.
Чому телеметрія важлива для оператора?
Оператор у додатку (або у веб-панелі) бачить по кожному автомату: залишки по комірках, виручку за день/тиждень/місяць, помилки (застряглий товар, відмова купюроприймача, проблема з рефрижерацією). Маршрут об'їзду — оптимізований список автоматів, які потрібно поповнити сьогодні, з урахуванням залишків та прогнозу продажів. Це скорочує час інкасації на 30% і збільшує середній чек на 25% за рахунок своєчасного поповнення. Для мережі з 50 автоматів економія часу інкасації становить до 15 годин на тиждень.
Інтеграція з системами обліку оператора: 1С, SAP, власні ERP — через REST або файловий обмін (CSV/XLS). Нормалізація даних з різних моделей автоматів — ключове завдання бекенду.
Як інтегрувати платіжний модуль з вендинговим автоматом?
Кроки інтеграції:
- Підключіть MDB-сумісний платіжний модуль до роз'єму на контролері автомата.
- Налаштуйте API-ключі та ендпоінти для обробки платежів (зазвичай через JSON-RPC).
- Перевірте емуляцію монети — сервер повинен надсилати команду на видачу товару.
- Протестуйте сценарії помилок: таймаут сесії, нестача решти, скасування платежу.
Більшість сучасних модулів (Nayax VPOS, PayLink) підтримують REST API, що спрощує розробку.
Порівняння платіжних модулів
| Модуль |
Спосіб зв'язку |
Підтримка MDB |
Додаткові функції |
| Nayax VPOS Touch |
Wi-Fi/4G |
Так |
Вбудований NFC, GPS |
| PayLink |
Bluetooth/Wi-Fi |
Так |
Інтеграція з Loyverse |
| CPI EMV |
RS-232 |
Так |
Емуляція купюр |
Терміни та вартість
Розробка клієнтського додатку та операторської панелі для мережі вендингових автоматів займає від 3 до 5 місяців. Вартість розраховується індивідуально після аналізу моделей автоматів та платіжної інфраструктури. Оцінимо проєкт безкоштовно — зв'яжіться з нами, щоб обговорити деталі.
Отримайте консультацію: наші інженери допоможуть підібрати оптимальне рішення під вашу мережу. Гарантія на розроблене ПЗ — 12 місяців.
Інтеграція з залізом: BLE, NFC, IoT та HomeKit у мобільних додатках
Коли задача — зв’язати смартфон з фізичним пристроєм, половина проблем знаходиться не в коді, а в прошивці заліза, характеристиках BLE-сервісів та затримках протоколу. Ми, як мобільні розробники, працюємо на стику з firmware-командою, і без розуміння стеку знизу вгору результат непередбачуваний. Ось чому ми завжди починаємо з HCI-логу та специфікації GATT — Apple Developer: Core Bluetooth Framework — це єдиний спосіб уникнути реверс-інжинірингу в польових умовах.
Чому BLE-інтеграція — найчастіша точка відмови?
Bluetooth Low Energy — основний протокол для носимих, медичних пристроїв, розумних замків та промислових датчиків. Core Bluetooth на iOS та BluetoothGatt на Android реалізують одну специфікацію, але поводяться по-різному в крайніх випадках. Статистика наших проектів: більше 70% звернень у підтримку по BLE пов’язані саме з низькорівневими помилками GATT, а не з логікою додатку.
| Сценарій |
iOS (Core Bluetooth) |
Android (BluetoothGatt) |
| Управління підключенням |
CBCentralManager потребує сильного посилання протягом всієї сесії; втрата об’єкта → розрив з’єднання |
disconnect() та close() викликаються окремо; close() без disconnect() → пристрій позначається зайнятим |
| Типова помилка |
Немає попередження при втраті посилання — з’єднання мовчки розривається |
Помилка 133 (GATT_ERROR) — виникає при переповненні черги GATT або некоректному закритті попередньої сесії |
| Сканування |
NSBluetoothAlwaysUsageDescription обов’язковий у Info.plist (з iOS 13); без нього сканування не стартує |
BLUETOOTH_SCAN потребує neverForLocation (Android 12+), інакше користувач бачить запит геолокації |
Що робити з помилкою 133 в Android?
Помилка 133 — найчастіша в Android BLE-розробці. Це не «щось пішло не так», а конкретний індикатор переповнення черги GATT або некоректного закриття попереднього з’єднання. Ми лікуємо її двома прийомами: використовуємо чергу операцій над GATT (write, read, notification subscribe строго послідовно через операційну чергу) та завжди викликаємо disconnect() перед close(). Наша черга GATT-операцій у 3 рази знижує кількість помилок ATT_INSUFFICIENT_RESOURCES порівняно з конкурентними запитами. MTU за замовчуванням — 23 байти. Запит на збільшення (MTU exchange) обов’язковий для передачі даних об’ємом понад 20 байт. На iOS MTU запитується автоматично при підключенні, на Android потрібно явно викликати requestMtu(). Без цього ви не зможете передати, наприклад, зображення або лог через характеристику.
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() ловить теги у foreground без системного UI. Фоновий запуск додатку по NFC-тегу реалізується через intent-filter з ACTION_NDEF_DISCOVERED. Порівняння платформ по NFC:
| Функція |
iOS (CoreNFC) |
Android (NfcAdapter) |
| Фонове читання |
Тільки з entitlement та ISO 14443 |
Через intent-filter ACTION_NDEF_DISCOVERED |
| Запис |
З iOS 13 (NDEF) |
З коробки (API 10+) |
| Сесія |
Триває до 5 хвилин з системним UI |
Необмежено у foreground, background по тегу |
| Запуск додатку |
Тільки foreground |
Автоматично при виявленні тегу |
HomeKit та Matter
HomeKit — екосистема Apple для розумного дому. Для інтеграції пристрій повинен мати MFi-сертифікацію (або працювати через Software Authentication для Matter). Мобільний додаток використовує HomeKit framework: 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 без перепрошивки, а конфігурація налаштовується в 4 рази швидше порівняно з власним HAP-протоколом.
| Параметр |
HomeKit |
Matter |
| Сертифікація |
MFi — апаратний чіп |
Software Authentication (ключі) |
| Підтримка платформ |
Тільки Apple |
Apple, Google, Amazon, Samsung |
| Додавання пристрою |
HMHomeManager |
MTRDeviceController / Google Home SDK |
| Протокол |
HAP (IP, BLE) |
IP-based (Wi-Fi, Thread) |
Для Flutter та React Native використовуємо flutter_blue_plus та react-native-ble-plx відповідно — обидва активно підтримуються і покривають 90% сценаріїв, але для роботи з GATT-нотифікаціями у background на Android все одно потрібен foreground service. Переконайтеся, що deep linking (Universal Links на iOS, App Links на Android) налаштовані для коректного пробудження додатку при скануванні NFC-тегу або отриманні push-повідомлення від IoT-пристрою. Вимоги ATT (App Tracking Transparency) для інтеграції з залізом зазвичай не застосовуються, але якщо додаток збирає анонімну аналітику — додайте запит. Отримайте консультацію нашого інженера — він розбере вашу специфікацію за 2 дні.
Як ми інтегруємо BLE та NFC?
-
Аналітика — отримуємо від firmware-команди повну специфікацію BLE GATT (список сервісів, характеристик, формати даних) або HCI-лог. Без цього розробка перетворюється на реверс-інжиніринг через nRF Connect або Wireshark over HCI.
-
Проектування — визначаємо архітектуру підключень: чергу GATT-операцій, фонові сервіси для Android, перепідключення при втраті зв’язку. Враховуємо MTU-узгодження та обробку помилок ATT_INSUFFICIENT_RESOURCES.
-
Реалізація — кодимо на Swift/Kotlin з урахуванням особливостей платформ (Universal Links, App Links, push-повідомлення через APNs/FCM для тригерів). Для захисту Android-коду використовуємо ProGuard / R8 (shrink).
-
Тестування — на реальних пристроях з першого дня. Емулятор BLE в симуляторах не відтворює edge cases перепідключення, втрати сигналу, зміни MTU. Використовуємо автоматизацію на базі XCTest та Espresso.
-
Деплой — завантаження в App Store Connect / Google Play Console з правильним code signing та provisioning profile. Для iOS — TestFlight, для Android — Firebase App Distribution.
Що входить в роботу (deliverables)
- Вихідний код мобільного додатку з інтеграцією BLE, NFC або IoT (Swift / Kotlin / Flutter / React Native)
- Документація по протоколу GATT (карта сервісів та характеристик)
- Навантажувальне тестування на 10+ реальних пристроях (помилка 133, перепідключення, MTU-узгодження)
- Аналіз та усунення edge cases (помилка ATT_INSUFFICIENT_RESOURCES, втрата з’єднання на фоні, конфлікт з background fetch)
- Інструкція зі збірки та деплою (code signing, TestFlight, Firebase App Distribution)
- Місяць підтримки після релізу
Строки та орієнтовна вартість
Проста інтеграція з одним BLE-периферійним пристроєм (показання + команди керування) — від 2 до 4 тижнів. Типова вартість такої задачі розраховується індивідуально, включаючи налагодження GATT-профілю та обробку edge cases. Повноцінний IoT-додаток з декількома типами пристроїв, firmware OTA-оновленнями та HomeKit-підтримкою — від 2 місяців. Вартість розраховується індивідуально під ваш проект.
Ми займаємося мобільною розробкою кілька років — досвід 45+ проектів з BLE/NFC/HomeKit. Наші інженери сертифіковані Apple та Google, а кожен етап роботи фіксується в issue tracker з прив’язкою до комітів. Ми гарантуємо прозорість процесу та дотримання строків. Використовуємо підхід «інженер клієнту»: без маркетингових пауз, з прямим доступом до розробника.
Закажіть оцінку — отримайте консультацію інженера з розбором вашої специфікації. Замовте інтеграцію під ключ: ми проаналізуємо HCI-лог, перевіримо GATT-характеристики та запропонуємо архітектуру за 2 дні.