Aller au contenu

CoAP & protocoles contraints

REST sur UDP pour les microcontrôleurs à quelques kilooctets de RAM : CoAP apporte les verbes HTTP aux objets les plus limités, sans le coût d'une pile TCP.


CoAP — Constrained Application Protocol (RFC 7252)

CoAP est un protocole applicatif RESTful sur UDP, standardisé par l'IETF en 2014. Il reprend les concepts HTTP (GET, POST, PUT, DELETE, codes de réponse) mais compresse les échanges à quelques dizaines d'octets. L'overhead d'un header CoAP est de 4 octets fixes, contre ~200 octets pour HTTP/1.1.

Modèle de message

CoAP définit quatre types de messages :

Type Abréviation Description
Confirmable CON Accusé de réception obligatoire (retransmission si timeout)
Non-confirmable NON Best-effort, pas d'ACK
Acknowledgement ACK Répond à un CON
Reset RST Rejette un message non reconnu

Les messages CON garantissent la livraison malgré UDP via un mécanisme d'exponential backoff (délai initial 2 s, facteur 1.5, max 5 tentatives).

Codes de réponse

CoAP réutilise la structure HTTP : 2.xx succès, 4.xx erreur client, 5.xx erreur serveur.

2.05 Content    — réponse GET avec données
2.01 Created    — ressource POST créée
4.04 Not Found  — ressource inexistante
4.01 Unauthorized
5.00 Internal Server Error

Observe pattern — notifications push

L'extension Observe (RFC 7641) transforme CoAP en protocole push : un client s'abonne à une ressource et reçoit des notifications à chaque modification, sans polling répété.

sequenceDiagram
    participant C as Client CoAP
    participant S as Serveur CoAP\n(capteur)

    C->>S: GET /temperature\n(CON, Observe: 0, Token: 0xA4)
    S->>C: ACK 2.05 Content\n(Observe: 1234, Payload: 22.5°C)
    Note over S: Température change → 23.1°C
    S-->>C: CON 2.05 Content\n(Observe: 1235, Payload: 23.1°C)
    C-->>S: ACK
    Note over S: Température change → 24.0°C
    S-->>C: CON 2.05 Content\n(Observe: 1236, Payload: 24.0°C)
    C-->>S: ACK
    C->>S: GET /temperature\n(CON, Observe: 1 = désabonnement)
    S->>C: ACK 2.05 Content\n(dernier état)

Le client annule l'abonnement en envoyant une requête avec Observe: 1, ou simplement en ne répondant plus aux CON (le serveur arrête après quelques retransmissions sans ACK).


LwM2M — gestion de device standardisée

Lightweight M2M (OMA SpecWorks) est un protocole de device management construit sur CoAP. Il standardise les opérations de provisioning, monitoring, mise à jour firmware (FOTA) et configuration distante.

Modèle objet/ressource

LwM2M organise les données en objets numérotés, chacun contenant des ressources :

/3/0/0    → Device / Instance 0 / Manufacturer
/3/0/9    → Device / Instance 0 / Battery Level (%)
/5/0/3    → Firmware Update / Package URI
/5/0/5    → Firmware Update / State (0=idle, 1=downloading…)
/3303/0/5700 → Temperature / Instance 0 / Sensor Value

Les objets standards sont définis dans le registre OMNA (0–32767). Les objets propriétaires utilisent la plage 32768+.

Phases du cycle de vie

stateDiagram-v2
    [*] --> Bootstrap : Première mise en service
    Bootstrap --> Registration : Credentials reçus
    Registration --> Management : Enregistrement broker LwM2M
    Management --> Management : Read / Write / Execute / Observe
    Management --> DeRegistration : Mise hors service
    Management --> Bootstrap : Reset ou rotation credentials

Opérations principales

Opération CoAP sous-jacent Description
Read GET Lire une ressource ou un objet
Write PUT/POST Modifier une valeur
Execute POST Déclencher une action (reboot, mise à jour)
Create POST Créer une instance d'objet
Observe GET + Observe S'abonner aux changements
Report CON notify Notification serveur → client

CBOR — sérialisation binaire compacte

Concise Binary Object Representation (RFC 7049 / RFC 8949) est l'alternative binaire à JSON pour les environnements contraints. Conçu par l'IETF pour être décodable sans schéma préalable.

Critère JSON CBOR
Encodage UTF-8 texte Binaire
Taille typique 100% (référence) 40–60%
Parse sur MCU 32 bits ~5 µs/octet ~1 µs/octet
Lisibilité humaine Oui Non (mais convertible)
Types supportés Limités Entiers 64b, float16, bytes, tags
Librairies embarquées TinyJSON, JSMN TinyCBOR, cn-cbor

Exemple : {"t": 22.5, "h": 65} en JSON = 18 octets ; en CBOR = 11 octets (−39%).

CBOR est utilisé natif dans LwM2M, COSE (signatures), CDDL (schémas) et les WebAuthn credentials.


DTLS — sécurité sur UDP

CoAP sur UDP nécessite DTLS (Datagram TLS, RFC 6347) pour la confidentialité et l'authentification. DTLS est TLS adapté à UDP : gestion des pertes de datagrammes, retransmission des handshakes, pas d'ordre garanti.

Modes de sécurité LwM2M

Mode Mécanisme Cas d'usage
NoSec Aucun Test, réseau isolé
PSK Clé pré-partagée 128 bits Flottes homogènes
RPK Clé publique brute (ECDSA) Coût moindre que PKI
Certificate X.509 via PKI Déploiements enterprise

Le handshake DTLS avec PSK sur un Cortex-M4 @ 120 MHz prend environ 200–400 ms et consomme ~8 Ko de RAM. C'est souvent le facteur limitant sur les MCU les plus contraints.


CoAP vs MQTT — quand choisir quoi ?

graph TD
    A{Besoin principal ?} --> B[Lire/écrire\nune ressource]
    A --> C[Diffuser des données\nen continu]
    B --> D{Ressources MCU ?}
    D -->|Très contraintes\n< 32 Ko RAM| E[CoAP + CBOR\nDTLS PSK]
    D -->|MCU standard\n> 64 Ko RAM| F[CoAP ou HTTP REST]
    C --> G{Nombre de\nconsommateurs ?}
    G -->|1 ou peu| H[CoAP Observe]
    G -->|Nombreux, découplés| I[MQTT pub/sub]
Critère CoAP MQTT
Transport UDP (+ DTLS) TCP (+ TLS)
Modèle Request/Response + Observe Publish/Subscribe
Header minimal 4 octets 2 octets
RAM client typique 4–16 Ko 16–64 Ko
Push natif Observe (RFC 7641) Natif
Sécurité DTLS TLS
Découplage client Non (adresse serveur connue) Oui (broker intermédiaire)
Device management LwM2M natif Via extensions (ex : Sparkplug)
Réseau sous-jacent UDP, 6LoWPAN, SMS TCP/IP
Cas d'usage principal MCU ultra-contraints, LwM2M Télémetrie, commandes, IIoT

Règle de décision rapide

  • CoAP : microcontrôleur < 64 Ko RAM, réseau UDP ou 6LoWPAN, besoin de device management LwM2M.
  • MQTT : MCU standard, nombreux consommateurs découplés, infrastructure broker existante.
  • Les deux peuvent coexister : une gateway traduit CoAP (réseau capteurs) → MQTT (backbone cloud).

Ce qu'il faut retenir

  • CoAP est REST sur UDP avec un overhead minimal de 4 octets — conçu pour les microcontrôleurs les plus contraints.
  • Le pattern Observe permet des notifications push sans polling, économisant batterie et bande passante.
  • LwM2M standardise le device management (provisioning, FOTA, configuration) au-dessus de CoAP.
  • CBOR réduit la taille des payloads de 40 à 60% face à JSON, critique sur les liaisons radio contraintes.
  • DTLS apporte la sécurité sur UDP, avec un overhead de handshake à dimensionner selon les ressources MCU.

Chapitre suivant : BLE & courte portée — Bluetooth Low Energy 5.x, mesh, NFC et RFID pour les communications de proximité.