Las actualizaciones OTA (over-the-air) envían nuevo firmware o software a una flota sin
tocar el hardware. CORE-M modela esto en dos partes: un OTA package (el
artefacto verificado y sus metadatos) y un rollout (la campaña escalonada que
lo entrega a un conjunto de dispositivos). La entrega viaja sobre
RPC persistente, de modo que una actualización llega a un dispositivo
cuando se conecta a continuación, y el dispositivo reporta el resultado de vuelta.
Esto es un how-to para operadores. Subirás un paquete, iniciarás un rollout de canary,
lo vigilarás y revertirás si sale mal.
Cuando subes un paquete, CORE-M descarga el artefacto y verifica su checksum
contra el sha256 declarado antes de que el paquete quede disponible para cualquier
rollout. Si el checksum calculado no coincide, el paquete se rechaza con
INVALID_ARGUMENT y nunca se asigna a ningún sitio. Los dispositivos verifican de forma independiente
la firma y el checksum tras la descarga, así que una transferencia corrupta se detecta en
ambos extremos.
Un rollout entrega un paquete a un conjunto objetivo de dispositivos, en etapas, con controles
de seguridad. Diriges a un device profile, empiezas con un pequeño porcentaje de
canary, y dejas que CORE-M expanda el rollout solo si el canary está sano.
stateDiagram-v2
[*] --> active : iniciar (canary %)
active --> paused : pausa del operador
active --> paused : umbral de fallo superado\n(auto, alerta)
paused --> active : reanudar
active --> rolling_back : rollback del operador
paused --> rolling_back : rollback del operador
active --> completed : todos los dispositivos objetivo con éxito
rolling_back --> completed : rollback terminado
completed --> [*]
Por dispositivo, cada objetivo rastrea su propio estado: scheduled → (comando de actualización enviado)
→ successful o failure, expuesto como registros de Device RPC.
Inicia el rollout. Dirígelo a un profile, apunta al paquete verificado y establece
un pequeño porcentaje de canary y un umbral de fallo. Solo la porción del canary recibe
el comando primero.
Solo el 5% de los dispositivos elegibles se programa inicialmente; el resto espera. Se publica
el evento profile.ota.rollout.started.{tenant}.{rollout_id}.
Las actualizaciones se entregan vía RPC persistente. CORE-M emite un comando ota_start
(una RPC persistente) a cada dispositivo programado. Como es persistente,
un dispositivo que está offline lo recibe al reconectar. El dispositivo descarga el
artefacto (reanudable, por chunks), verifica firma y checksum, lo aplica,
y se reinicia.
Los dispositivos reportan resultados. Cada dispositivo reporta de vuelta su firmware_version y
success/failure. En caso de éxito su estado de rollout pasa a successful, su
campo de firmware del dispositivo se actualiza a la nueva versión, y los contadores de éxito del
rollout avanzan.
{
"device_id": "dev_8f3a",
"rollout_id": "rol_4c7e",
"firmware_version": "2.0.0",
"status": "success"
}
Vigila el canary, luego expande. Si el canary se mantiene sano, avanza el
rollout al resto de la flota (reanudar / subir el canary). Si no, el
umbral de fallo interviene — ver abajo.
Puedes pausar un rollout en cualquier momento, y CORE-M lo pausa automáticamente si
los fallos cruzan el umbral. Con failure_threshold_percent=10, una vez que el 11% de los
dispositivos del canary reporta fallo el monitor del rollout lo cambia a paused,
no programa más dispositivos, y publica el evento de alerta
profile.ota.rollout.paused.{tenant}.{rollout_id}.
Cuando el nuevo build es malo, revierte al rollback_package_id configurado.
CORE-M envía comandos de rollback a los dispositivos afectados, pone el rollout en
rolling_back, y rastrea cada comando a través de registros de Device RPC — así obtienes
la misma visibilidad por dispositivo a la baja que a la alza.
Un dispositivo bajo un rollout se entera de su paquete asignado y descarga los bytes
él mismo:
GET /api/v1/devices/{device_id}/ota devuelve los metadatos del paquete
(package_id, type, version, size_bytes, checksum) para el
dispositivo autenticado — la asignación a nivel de dispositivo prevalece sobre la de nivel de profile.
GET /api/v1/devices/{device_id}/ota/chunk transmite el artefacto como rangos de bytes
(limitados a 64 KiB por chunk), en cualquier orden, para que las descargas sean reanudables sobre
enlaces inestables. Un dispositivo solo puede obtener su propio paquete asignado; cualquier otro
package_id devuelve PermissionDenied.
El dispositivo verifica el checksum (y la firma) una vez que llega el último chunk
(complete: true) antes de aplicar la actualización.