DRAFT — Preliminary version, do not share. · Version préliminaire, ne pas partager.

Topics et formats de messages MQTT

Cette page répertorie les paramètres de connexion du broker MQTT, la manière dont un appareil s'authentifie, ainsi que tous les topics sur lesquels un appareil peut publier ou s'abonner, avec leur charge utile. Utilisez-la lorsque vous écrivez ou déboguez la couche MQTT de votre micrologiciel.

Deux voies prises en charge. Votre micrologiciel peut communiquer directement avec le broker via n'importe quel client MQTT 5, en suivant cette page. Il peut aussi utiliser le daemon Linux ou la bibliothèque MCU, qui implémentent ce protocole à votre place, y compris la gestion des clés, les heartbeats, les actions et les mises à jour du micrologiciel. Certains topics sont configurables par registre : lisez-les depuis le registre plutôt que de les coder en dur.

Paramètres de connexion

Paramètre Valeur
Hôte mqtts.fundamentum-iot.com
Port 8883 (MQTT sur TLS)
Protocole MQTT 5
Certificat client Non requis
Server Name Indication (SNI) Requis : envoyez le nom d'hôte du broker lors de la négociation TLS
Nom d'utilisateur Non utilisé. Définissez-le à unused
Mot de passe Un JWT d'appareil, voir Authentication
Client ID Identifie l'appareil, voir Client ID

Connectez-vous toujours à l'hôte et au port renvoyés par le provisionnement (data.mqtt.host et data.mqtt.port), voir Devices API v3.

Les piles TLS embarquées doivent faire confiance à l'autorité de certification racine de la chaîne du broker. Inspectez la chaîne avec :

openssl s_client -showcerts -verify 5 -connect mqtts.fundamentum-iot.com:8883

Authentification

L'appareil signe un JWT avec sa clé privée, celle dont il a enregistré la clé publique lors du provisionnement. Le broker le vérifie à l'aide de cette clé publique. Aucun secret partagé ne circule sur le réseau.

Claim Valeur
aud L'ID du projet
iat Heure d'émission (secondes Unix)
exp Heure d'expiration (secondes Unix)

Signez avec RS256. Le broker refuse la connexion si la signature est invalide, si le jeton est expiré ou si aud ne correspond pas au projet figurant dans le client ID.

Client ID

Forme longue :

projects/<project-id>/regions/<region-id>/registries/<registry-id>/devices/<serial-number>

Forme courte, pour les appareils où la longueur compte :

<project-id>.<region-id>.<registry-id>.<serial-number>
Élément Description
project-id Entier. Votre projet
region-id Entier. 1 sauf indication contraire
registry-id Entier. Le registre dans lequel l'appareil a été provisionné
serial-number Chaîne. Unique dans son registre. Le broker le convertit en minuscules

Topics

Chaque topic commence par le préfixe propre à l'appareil :

registries/<registry-id>/devices/<serial-number>/

Un appareil ne peut publier et s'abonner que sous son propre préfixe. Il n'existe pas de trafic d'appareil à appareil : vos systèmes reçoivent les données des appareils via des connecteurs.

De l'appareil vers Fundamentum

Topic (après le préfixe) Charge utile Objectif
events Format libre Télémétrie, envoyée au topic de télémétrie par défaut du projet
events/<name> Format libre Télémétrie envoyée au topic du registre configuré sous <name>
subdevices/<sub-serial-number>/events Format libre Télémétrie pour le compte d'un sous-appareil. Seul events est autorisé sous subdevices/
states Format libre ; JSON Fundamentum recommandé États de l'appareil et lectures des balises
heartbeat JSON, ou protobuf avec v: 1 Preuve que l'appareil est actif
commands/<device-command-id> JSON Résultat d'une commande
actions/<action-id>/response Protobuf Résultat d'une action
pfwd/rx Binaire Réservé à l'agent de redirection de ports

De Fundamentum vers l'appareil

Topic (après le préfixe) Charge utile QoS Retenu Objectif
config JSON — — Configuration de l'appareil, envoyée une fois lorsque l'appareil s'abonne
commands Tableau JSON 0 Oui Commandes en attente. Retenu, de sorte qu'un appareil qui se reconnecte les reçoit
actions Protobuf 2 Non Actions à exécuter
custom_actions Binaire 0 Non Vos propres messages applicatifs
custom_actions/<name> Binaire 0 Non Vos propres messages applicatifs sur un canal nommé
pfwd/tx Binaire 2 Non Réservé à l'agent de redirection de ports

Les messages sur custom_actions ne sont livrés que lorsque l'appareil est abonné. Rien n'est renvoyé vers le cloud pour ces messages.

Charges utiles

Télémétrie : events

Des octets quelconques. Fundamentum transmet la télémétrie telle quelle, vous choisissez donc votre propre format. Décodez un format propriétaire avec une fonction cloud.

États : states

Toute charge utile parvient au topic des états du registre. Lorsque vous utilisez le format JSON Fundamentum, la plateforme stocke également les états (historique et dernières valeurs) et extrait les lectures des balises :

{
  "timestamp": 1789167823,
  "states": {
    "battery_level": 87,
    "temperature": 21.4
  },
  "beacons": [
    {
      "identification": "beacon-abc123",
      "states": { "rssi": -67, "battery_level": 44 }
    }
  ]
}
Champ Description
timestamp Heure Unix en secondes
states Objet libre : n'importe quel nom, n'importe quelle valeur
beacons[].identification Identifie la balise, qui est traitée comme un appareil à part entière
beacons[].states Les états de la balise. rssi, lorsqu'il est présent, est enregistré comme un scan

Heartbeat : heartbeat

La propriété utilisateur MQTT 5 v sélectionne le format.

Sans v, ou avec v: 0, envoyez du JSON contenant le nombre de secondes écoulées depuis le démarrage :

{ "uptime": 86400 }

Avec v: 1, envoyez un message protobuf Heartbeat. Il peut aussi transporter les sous-appareils pour lesquels une passerelle s'exprime, chacun avec son numéro de série et son uptime. Voir Gateways and sub-devices.

Les schémas protobuf des heartbeats et des actions sont publiés dans le crate fundamentum-iot-mqtt-proto sur crates.io.

Commandes : commands et commands/<device-command-id>

L'appareil reçoit un tableau JSON de commandes en attente, chacune ayant la forme suivante :

{
  "device_command_id": 1,
  "command_short_name": "command-name",
  "parameters": {}
}
command_short_name Paramètres
reboot device_id
firmware-update target_device, et version avec configuration_file_url (URL de téléchargement), configuration (libre, transmise telle quelle), identifier, name
custom-configuration-update deep_update (applique toute la configuration si true, uniquement la différence si false), retry_timeout (secondes), target_device.actual_configuration, target_device.new_configuration

Exemple de mise à jour du micrologiciel :

{
  "device_command_id": 790,
  "command_short_name": "firmware-update",
  "parameters": {
    "device_id": 296,
    "command_id": 8,
    "version_id": 29,
    "target_device": { "serial_number": "<serial-number>", "id": 296 },
    "version": {
      "configuration_file_url": ["https://<download-url>"],
      "configuration": {},
      "identifier": "base-firmware-1-4-2",
      "name": "base-firmware-version",
      "id": 29
    }
  }
}

command_id et version.id sont des identifiants internes que l'appareil peut ignorer.

Signalez la progression sur commands/<device-command-id> :

{ "status": "success", "message": "firmware updated to 1.4.2" }
Champ Valeurs
status ongoing, success ou failure
message Texte libre décrivant le changement d'état

Voir Firmware updates (OTA).

Actions : actions et actions/<action-id>/response

Les actions sont des messages protobuf. L'appareil signale le résultat sur actions/<action-id>/response, également en protobuf. Les actions sont définies par type d'appareil et traduites pour chaque version du micrologiciel par des encodeurs. Voir Actions and custom encoders.

Configuration : config

La configuration enregistrée de l'appareil, au format JSON. Elle n'a pas de forme fixe : c'est ce que vous avez enregistré pour l'appareil, par exemple avec POST .../configuration sur la Devices API.

Étapes suivantes