# Protocolo Device Exchange v1

## Cabeçalhos

```text
X-H2O-Device-ID: <UUID>
X-H2O-Timestamp: <Unix UTC>
X-H2O-Nonce: <valor aleatório único>
X-H2O-Signature: <HMAC-SHA256 hexadecimal>
Content-Type: application/json
```


## Sincronização de horário

A assinatura exige horário UTC dentro da janela configurada. Antes do primeiro exchange, a Controller deve sincronizar por NTP. Como contingência, pode consultar `GET /api/health` por HTTPS com validação de CA e usar o campo `time`; esta resposta nunca substitui a validação TLS do servidor.

## String canônica

```text
METHOD\nPATH\nTIMESTAMP\nNONCE\nSHA256_BODY
```

## Corpo de exemplo

```json
{
  "protocol_version": 1,
  "identity": {
    "serial_number": "H2O-UDI-2026-0001",
    "asset_number": "PAT-1842",
    "product_model": "H2O Ultra DI",
    "hardware_model": "H2O-CTRL-S3-A",
    "hardware_revision": "A1",
    "customer_name": "Laboratório Exemplo",
    "installation_address": "Goiânia, GO"
  },
  "status": {
    "firmware_version": "2.2.1",
    "operation_state": "IDLE",
    "alarm_code": null,
    "reported_config_revision": 4
  },
  "telemetry": [
    {
      "sequence": 1001,
      "measured_at": 1781960400,
      "pressure_psi": 42.1,
      "flow_lpm": 1.82,
      "conductivity_in_us": 530.0,
      "conductivity_post_ro_us": 14.2,
      "conductivity_out_us": 0.82,
      "temperature_c": 24.6,
      "state": "PRODUCTION"
    }
  ],
  "acknowledgements": []
}
```

## Resposta

```json
{
  "ok": true,
  "protocol_version": 1,
  "server_time": 1781960401,
  "poll_after_seconds": 15,
  "desired_config": null,
  "commands": []
}
```

A Controller deve persistir `command_uid` já processados para manter idempotência após reinício.
