RobotWash – Sistema de Kiosco de Lavado Automático
RobotWash necesitaba un sistema de kiosco totalmente integrado para estaciones de lavado automático: un terminal de pantalla táctil orientado al cliente que acepta pagos, controla el hardware de lavado y guía al usuario a través del proceso, junto con una aplicación móvil de cajero y administrador para el operador. El sistema tenía que ser confiable en un entorno industrial con hardware de pago en el circuito.
El sistema de tres capas
- Backend: Rust para el control del hardware de pago – el núcleo del sistema es un servicio Rust que se comunica directamente con el hardware del terminal de pago y orquesta los estados de la máquina de lavado. Elegimos Rust por sus garantías de seguridad de memoria, rendimiento determinista y adecuación para procesos embebidos de larga duración donde un fallo o fuga de memoria sería inaceptable.
- Frontend de kiosco: Angular – una aplicación Angular a pantalla completa que se ejecuta en la pantalla táctil del cliente. Guía al usuario a través de la selección del programa de lavado, el pago y el monitoreo de estado. Diseñada para uso exterior/industrial: objetivos táctiles grandes, visuales de alto contraste, sin dependencia de dispositivo señalador.
- App de cajero y admin: Android – app Android nativa para el operador de la estación. Maneja gestión de sesiones, historial de transacciones, monitoreo de estado del hardware y tareas básicas de administración. Funciona sobre la red local de la estación de lavado para que los operadores puedan gestionar desde cualquier lugar del sitio.
¿Por qué Rust para el control de hardware?
La integración de hardware de pago no perdona errores: un proceso bloqueado en medio de una transacción significa un cliente confundido y un estado de caja potencialmente inconsistente. El modelo de propiedad de Rust elimina en tiempo de compilación clases enteras de errores de concurrencia y memoria, dándonos confianza en la estabilidad a largo plazo de un proceso que funciona 24/7 sin reinicios programados.
La comunicación serie y a nivel de protocolo con terminales de pago físicos también se beneficia del control de bajo nivel de Rust – podemos ser precisos sobre el tiempo y el encuadre de mensajes a nivel de bytes de maneras que son incómodas en lenguajes de más alto nivel.
Desafíos de integración
- Máquina de estados de hardware – la máquina de lavado pasa por una secuencia bien definida de estados (inactivo → aceptando pago → lavando → enjuagando → listo → error), pero los eventos de hardware son asíncronos y pueden llegar en orden incorrecto. El backend Rust modela la máquina de estados explícitamente, haciendo las transiciones ilegales imposibles a nivel de tipo.
- Certificación de pagos – los terminales de pago con tarjeta tienen requisitos de certificación estrictos. Nuestra capa de integración fue diseñada para ser delgada y auditable, tocando la API del terminal solo de las maneras requeridas por la especificación de certificación.
- Resiliencia sin conexión – las estaciones de lavado a menudo están en ubicaciones con conectividad poco confiable. Los registros de transacciones se persisten localmente primero; la sincronización con un backend central ocurre oportunistamente cuando hay conexión disponible.
Lo que aprendimos
Este proyecto reforzó que elegir la herramienta correcta para la capa correcta importa. Rust para la capa de hardware crítica para la seguridad, Angular para la UI interactiva del kiosco, Android para el flujo de trabajo móvil del operador – cada elección fue deliberada, no de moda.
También demostró nuestra capacidad para entregar un producto full-stack que abarca software embebido, frontend web y móvil – el tipo de amplitud que es cada vez más posible con equipos más pequeños, aumentados por IA.