Milodón VMC: App Android Embebida & Panel Web de Control
Ecosistema de software diseñado para sustituir entornos propietarios descontinuados en infraestructura de autoservicio (Vending). Integra un orquestador mecatrónico local en modo Kiosk y una plataforma web de telemetría en tiempo real.
Arquitectura de Dos Núcleos
Un diseño desacoplado que separa el control electromecánico y la cobranza en terreno respecto al monitoreo de inventario y la analítica de negocio.
Milodón VMC App (Android)
Interfaz gráfica de kiosco (Kiosk Mode) y orquestador mecatrónico que ejecuta en el SoC local. Gestiona el catálogo, el procesamiento de pagos transaccionales vía POS USB y la comunicación serie nativa con la placa de expansión.
- Kiosk Mode Inmersivo Estricto
- Puente NDK/JNI UART (/dev/ttyS3)
- Integración Transbank USB Host API
- Autocorrección RTC vía NTP + Root Shell
Milodón Web Dashboard
Plataforma web responsiva en tiempo real para la gestión centralizada del parque de máquinas. Permite el control de inventario por coordenadas de matriz, monitoreo financiero, auditoría y despacho de comandos remotos.
- Matriz interactiva de espirales (Vending Layout)
- Métricas y analítica con Chart.js
- Consola de Comandos Remotos (Firestore)
- Autenticación y Session Tokens
Milodón VMC App: Módulos NDK, I/O y Resiliencia
Interfaz & Kiosk Mode
Inmersión estricta (SYSTEM_UI_FLAG_IMMERSIVE_STICKY) con bloqueo de suspensión. Incluye módulo de guardapantallas (ScreensaverActivity) con descarga y reproducción dinámicas de video promocional, y menú técnico oculto activable mediante patrón táctil de seguridad (5 toques en < 1000 ms).
Puente Serie JNI / NDK
Comunicación a nivel de kernel (/dev/ttyS3 @ 19200 bps) mediante android_serialport_api. Orquesta una máquina de estados con control de concurrencia (AtomicBoolean) que ejecuta un latido (heartbeat) de 800 ms y pausa de forma atómica para inyectar secuencias de giro electromecánico.
Pasarela POS USB Host
Integración mediante la API android.hardware.usb (CDC-ACM) directamente con el terminal Transbank PAX IM30. Permite la cobranza con tarjetas de débito, crédito y contactless evitando la intermediación inestable del bus MDB tradicional.
Sincronización RTC (Root Shell)
Debido a la ausencia de batería RTC en el SoC RK3288, el servicio MilodonApp consulta la hora exacta vía protocolo NTP al arrancar y ejecuta comandos con privilegios Root (su -> date) para corregir el reloj del SO, evitando el rechazo de certificados SSL/TLS en Firebase/Supabase.
Milodón Web Dashboard: Matriz & Telemetría
Métricas & Heartbeat
Cálculo dinámico de ingresos, volumen transaccional, ranking de productos y detección automática de stock crítico (≤ 3 unidades). Monitorea el estado de conectividad de cada máquina midiendo el intervalo del último latido reportado (≤ 15 min).
Matriz de Espirales (Layout)
Mapeo gráfico e interactivo de la grilla física de motores (Filas 1-2: 6 motores; Filas 3-6: 9 motores). Codificación cromática de estado (Gris, Verde, Amarillo, Rojo) con editor modal para actualización de precios CLP, stock e imágenes en Firebase Storage.
Consola de Comandos Remotos
Módulo de despacho de instrucciones a la colección remote_commands de Firestore. Permite ordenar giros de prueba de motores, reinicios de la aplicación y lectura de logs de diagnóstico procesados asíncronamente por el RemoteCommandManager móvil.
Seguridad & Autenticación
Protección de rutas de administración mediante Firebase Auth y verificación de tokens de sesión mediante middlewares y cookies (session_token) en renderizado híbrido Server-Side de Astro.
Desafíos Técnicos Resueltos
| Desafío Técnico | Causa Raíz | Solución Implementada |
|---|---|---|
| Pérdida de hora en SO | Ausencia de batería RTC en SoC RK3288. Al apagar, la fecha volvía a 2013, bloqueando handshakes SSL/TLS. | Servicio en MilodonApp que consulta tiempo vía NTP y ejecuta su -> date antes de instanciar clientes cloud. |
| Incompatibilidad MDB Cashless | Fallas de identificación NAMA MDB Level 3 entre la placa base Wuyi y lectores MDB externos. | Rediseño de arquitectura: integración directa del POS PAX IM30 mediante USB Host API hacia Android. |
| Colisiones en Bus UART | Envío de comandos de giro durante la emisión del pulso de latido (POLL) de la placa base. | Hilo de control de concurrencia con barreras atómicas (AtomicBoolean) para pausas síncronas del POLL. |
| Ingeniería Inversa de Protocolo | Código y protocolo cerrado en la aplicación de fábrica previa (Ventor). | Extracción de APK, descompilación Smali/Java y análisis de logs para aislar la estructura de tramas ASCII (NOAD...). |
// Ficha_Del_Stack_Tecnologico.json
- • Lenguaje: Kotlin
- • Framework: Android SDK (API 22+)
- • Capas Nativas: JNI / NDK (
android_serialport_api), USB Host API - • Base de Datos & Cloud: Firebase Firestore Realtime, Supabase Client SDK
- • CLI / SO: Linux Shell (
su), Protocolo NTP
- • Framework: Astro 6.x, React 19.x
- • Estilos & UI: Tailwind CSS 4.x
- • Backend & BaaS: Firebase Auth, Firebase Firestore, Firebase Storage
- • Visualización de Datos: Chart.js
- • Despliegue: Vercel / Node.js SSR runtime