====== 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 === * Verificar conectividad de red * Revisar configuración de proxy/firewall * Comprobar credenciales de API === 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 ===== * [[p2p-architecture|Arquitectura P2P]] * [[p2p-flow|Flujo P2P]] * [[local-storage|Almacenamiento Local]] * [[delivery-service-flow|Gestión de Estado]] * [[hardware-integration|Hardware Integration]]