Funcionamiento de Machine: Online vs Offline
📡 Modos de Conectividad
La aplicación Machine puede operar en dos modos principales de conectividad: Online y Offline. Esta flexibilidad permite el funcionamiento continuo incluso en entornos con conectividad limitada.
🔗 Modo Online
Características Principales
Cuando Machine tiene acceso a internet, opera en modo online con las siguientes capacidades:
✅ Conexión Backend
Sincronización automática con servidor central
Actualización de datos en tiempo real (beneficiarios, rutas, entregas)
Envío inmediato de resultados de entregas
Descarga de actualizaciones de modelos ML y configuraciones
✅ Funcionalidades Avanzadas
Reconocimiento facial con modelos actualizados
Verificación de peso con calibración remota
Reportes en tiempo real al backend
Notificaciones push desde el servidor
Sincronización bidireccional con RutaPAE via P2P
✅ Beneficios
Datos actualizados garantizados
Procesamiento remoto para casos complejos
Backup automático en la nube
Monitoreo centralizado del estado de dispositivos
Flujo de Operación Online
graph TD
A[Machine inicia] --> B{¿Conectividad?}
B -->|Sí| C[Modo Online]
C --> D[Conectar backend]
D --> E[Sincronizar datos]
E --> F[Procesar entregas]
F --> G[Enviar resultados]
G --> H[Continuar monitoreo]
🔌 Modo Offline
Características Principales
Cuando no hay conectividad a internet, Machine automáticamente cambia a modo offline:
✅ Funcionamiento Local
Base de datos local con datos sincronizados previamente
Procesamiento offline de reconocimiento facial
Almacenamiento temporal de resultados de entregas
Sincronización P2P con dispositivos RutaPAE cercanos
✅ Capacidades Limitadas
Datos cacheados: Beneficiarios y rutas disponibles localmente
Modelos ML locales: Reconocimiento facial sin actualización
Almacenamiento limitado: Resultados pendientes de sincronización
Funcionalidad básica: Captura, verificación y almacenamiento
✅ Sincronización P2P
Wi-Fi Direct para conexión directa con RutaPAE
Transferencia de datos sin requerir internet
Sincronización automática al detectar dispositivos compatibles
Protocolo DirectLink para transferencia eficiente
Flujo de Operación Offline
graph TD
A[Machine inicia] --> B{¿Conectividad?}
B -->|No| C[Modo Offline]
C --> D[Cargar datos locales]
D --> E[Procesar entregas]
E --> F[Almacenar localmente]
F --> G{¿RutaPAE cercano?}
G -->|Sí| H[Sincronizar P2P]
G -->|No| I[Esperar conectividad]
I --> J[Reintentar conexión]
🔄 Transición entre Modos
Detección Automática
Machine monitorea continuamente la conectividad:
// En ConnectivityManager
fun checkConnectivity(): ConnectivityMode {
return when {
isInternetAvailable() -> ConnectivityMode.ONLINE
isWifiDirectAvailable() -> ConnectivityMode.P2P_READY
else -> ConnectivityMode.OFFLINE
}
}
Estrategias de Transición
Online → Offline
Detección de pérdida de conectividad
Cambio automático a modo offline
Notificación al usuario del cambio de estado
Continuación del flujo con datos locales
Offline → Online
Recuperación de conectividad detectada
Sincronización automática de datos pendientes
Actualización de modelos y configuraciones
Envío de resultados acumulados
P2P Sincronización
Detección de dispositivos RutaPAE cercanos
Establecimiento de conexión Wi-Fi Direct
Transferencia de datos usando DirectLink
Confirmación de sincronización exitosa
📊 Gestión de Datos
En Modo Online
// Sincronización automática
suspend fun syncOnline() {
val beneficiaries = api.getBeneficiaries()
localDb.saveBeneficiaries(beneficiaries)
val deliveries = localDb.getPendingDeliveries()
api.sendDeliveries(deliveries)
localDb.markAsSynced(deliveries)
}
En Modo Offline
// Almacenamiento local con marca de pendiente
suspend fun processOffline(delivery: Delivery) {
val result = processDeliveryLocally(delivery)
localDb.saveDelivery(result.copy(synced = false))
// Intentar P2P si disponible
if (p2pManager.hasNearbyDevices()) {
p2pManager.syncWithRutaPAE(result)
}
}
Estrategia de Cache
Beneficiarios: Cache permanente (actualizado en online)
Rutas: Cache temporal (válido por sesión)
Modelos ML: Cache con versión (actualizado en online)
Resultados: Almacenamiento temporal hasta sincronización
⚠️ Limitaciones del Modo Offline
Funcionalidades Restringidas
| Funcionalidad | Online | Offline | Notas |
| Reconocimiento facial | ✅ Completo | ✅ Completo | Modelos locales |
| Verificación de peso | ✅ Calibrado | ✅ Calibrado | Sin recalibración remota |
| Sincronización | ✅ Inmediata 🔄 P2P | 🔄 P2P | Conexión con dispositivo cernano independiente |
| Reportes | ✅ Tiempo real | ⏳ Pendiente | Hasta próxima conexión |
| Actualizaciones | ✅ Automáticas | ❌ Manuales | Requiere conexión |
Gestión de Recursos
Almacenamiento
Límite de entregas pendientes: Máximo 1000 registros
Rotación automática: Eliminación de registros antiguos (>30 días)
Compresión: Datos comprimidos para optimizar espacio
Memoria
Modelos ML optimizados: Versión reducida para offline
Cache inteligente: Liberación automática de recursos no usados
Procesamiento secuencial: Evita sobrecarga de memoria
🔧 Configuración
Parámetros de Conectividad
// En build.gradle.kts o runtime
object ConnectivityConfig {
const val SYNC_INTERVAL_ONLINE = 300_000L // 5 minutos
const val SYNC_INTERVAL_P2P = 60_000L // 1 minuto
const val MAX_OFFLINE_DELIVERIES = 1000
const val CACHE_VALIDITY_DAYS = 30
}
Configuración de P2P
// En P2PManager
data class P2PConfig(
val serviceName: String = "PAE-Machine",
val port: Int = 8888,
val timeout: Long = 30_000L,
val maxRetries: Int = 3
)
📱 Interfaz de Usuario
Indicadores de Estado
La UI muestra claramente el estado de conectividad:
🟢 Verde: Modo online completo
🟡 Amarillo: Modo P2P activo
🔴 Rojo: Modo offline
⚪ Blanco: Sin conectividad
Notificaciones
// Notificaciones automáticas
fun notifyConnectivityChange(mode: ConnectivityMode) {
when (mode) {
ONLINE -> showNotification("Conectado", "Sincronización activa")
P2P_READY -> showNotification("P2P disponible", "Sincronizando con RutaPAE")
OFFLINE -> showNotification("Modo offline", "Funcionalidad limitada")
}
}
🔍 Monitoreo y Diagnóstico
Logs de Conectividad
// Logging detallado
logger.info("Connectivity changed: $previousMode -> $currentMode")
logger.debug("P2P devices found: ${devices.size}")
logger.warn("Offline mode activated - limited functionality")
Métricas de Rendimiento
Tiempo de sincronización online vs P2P
Tasa de éxito de transferencias P2P
Uso de almacenamiento en modo offline
Latencia de procesamiento local vs remoto
🛠️ Troubleshooting
Problemas Comunes
No cambia a modo online
P2P no funciona
Verificar Wi-Fi Direct habilitado
Comprobar dispositivos RutaPAE cercanos
Revisar permisos de ubicación
Sincronización falla
Verificar espacio de almacenamiento
Comprobar integridad de base de datos local
Revisar logs para errores específicos
Comandos de Diagnóstico
# Ver estado de conectividad
adb shell dumpsys connectivity
# Ver logs de P2P
adb logcat | grep -i p2p
# Ver estado de sincronización
adb shell run-as co.ada.machine sqlite3 /data/data/co.ada.machine/databases/app.db "SELECT COUNT(*) FROM deliveries WHERE synced = 0;"
📋 Mejores Prácticas
Para Desarrollo
Probar ambos modos en desarrollo
Simular desconexión para testing offline
Implementar graceful degradation para funcionalidades críticas
Optimizar modelos ML para funcionamiento offline
Para Producción
Monitorear conectividad continuamente
Configurar alertas para cambios de modo
Planificar capacidad de almacenamiento offline
Documentar procedimientos de recuperación
Para Usuarios
Mantener dispositivos actualizados cuando hay conectividad
Verificar sincronización antes de desconectar
Reportar problemas de conectividad inmediatamente
Entender limitaciones del modo offline
🔗 Referencias