Tabla de Contenidos

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

✅ Funcionalidades Avanzadas

✅ Beneficios

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

✅ Capacidades Limitadas

✅ Sincronización P2P

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

  1. Detección de pérdida de conectividad
  2. Cambio automático a modo offline
  3. Notificación al usuario del cambio de estado
  4. Continuación del flujo con datos locales

Offline → Online

  1. Recuperación de conectividad detectada
  2. Sincronización automática de datos pendientes
  3. Actualización de modelos y configuraciones
  4. Envío de resultados acumulados

P2P Sincronización

  1. Detección de dispositivos RutaPAE cercanos
  2. Establecimiento de conexión Wi-Fi Direct
  3. Transferencia de datos usando DirectLink
  4. 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

⚠️ 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

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:

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

🛠️ Troubleshooting

Problemas Comunes

No cambia a modo online

P2P no funciona

Sincronización falla

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

  1. Probar ambos modos en desarrollo
  2. Simular desconexión para testing offline
  3. Implementar graceful degradation para funcionalidades críticas
  4. Optimizar modelos ML para funcionamiento offline

Para Producción

  1. Monitorear conectividad continuamente
  2. Configurar alertas para cambios de modo
  3. Planificar capacidad de almacenamiento offline
  4. Documentar procedimientos de recuperación

Para Usuarios

  1. Mantener dispositivos actualizados cuando hay conectividad
  2. Verificar sincronización antes de desconectar
  3. Reportar problemas de conectividad inmediatamente
  4. Entender limitaciones del modo offline

🔗 Referencias