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

Devices API v3

Cette page répertorie chaque endpoint de la Devices API v3, les informations d'identification attendues par chacun, ainsi que les conventions de requête et de réponse. Utilisez-la avec la spécification OpenAPI en ligne lorsque vous développez le micrologiciel d'un appareil, des outils d'usine ou des scripts de provisionnement.

URL de base et spécification

Élément Valeur
URL de base https://devices.fundamentum-iot.com
Spécification OpenAPI (v3) https://devices.fundamentum-iot.com/api/v3/swagger.json
Swagger UI https://devices.fundamentum-iot.com/api/v3/docs/
Vérification de l'état GET /status (aucune information d'identification)

La spécification est au format OpenAPI 3.0.1. Générez-en un client avec n'importe quel générateur OpenAPI, comme décrit dans Public API.

La Devices API est destinée aux appareils et aux outils qui les mettent en service. Pour gérer votre parc, vos utilisateurs et vos données, utilisez la Public API.

Informations d'identification

Toutes les informations d'identification circulent dans la requête, jamais dans l'URL. Les informations d'identification de type bearer utilisent l'en-tête Authorization: Bearer <value>.

Information d'identification Schéma de la spécification Description Où l'obtenir
Jeton de registre aucun (champ du corps access_token) Un jeton limité à un registre, envoyé dans le corps des requêtes de provisionnement Le fichier de jeton généré dans le Hub, ou GET /api/v3/registries/{registry_id}/token
JWT d'appareil deviceJwtKey Un JWT que l'appareil signe avec sa propre clé privée. Il s'agit du même type de jeton que celui utilisé par l'appareil comme mot de passe MQTT Généré sur l'appareil, voir MQTT topics and message formats
Clé de provisionnement provisioningKey Un UUID valide entre une date de début et une date de fin, pour la préinscription en usine POST .../provisioning-keys
Jeton d'utilisateur ou de compte de service oAuthFundamentum Le même jeton OAuth2 que celui utilisé sur la Public API fun login, ou un jeton de compte de service, voir Authentication

Un JWT d'appareil ou une clé de provisionnement n'est jamais accepté par la Public API.

Device security

Endpoints

Dans le tableau, {P} représente /api/v3/projects/{project_id}/regions/{region_id}. L'identifiant de région est 1, sauf indication contraire.

Provisionnement

Méthode Chemin Informations d'identification Objet
POST /api/v3/provision Jeton de registre dans le corps Provisionnement sécurisé. Renvoie 409 si l'appareil est déjà provisionné
PUT /api/v3/provision Jeton de registre dans le corps Provisionnement forcé : remplace délibérément la clé de l'appareil
GET /api/v3/registries/{registry_id}/token Jeton d'utilisateur Obtenir le fichier de jeton du registre

Corps de la requête pour les deux méthodes de provisionnement :

Champ Type Description
project_id integer Votre projet
region_id integer La région
registry_id integer Le registre que l'appareil rejoint
serial_number string Numéro de série de l'appareil (voir identifiants)
asset_type_id integer Type d'actif. Vaut 2 par défaut (appareil IoT). Il ne s'agit pas de l'identifiant du type d'appareil
access_token string Le jeton de registre
algorithm string RS256 ou Password
secret string La clé publique de l'appareil au format PEM (pour RS256)
POST /api/v3/provision HTTP/1.1
Host: devices.fundamentum-iot.com
Content-Type: application/json

{
  "project_id": <project-id>,
  "region_id": 1,
  "registry_id": <registry-id>,
  "serial_number": "<serial-number>",
  "asset_type_id": 2,
  "access_token": "<registry-token>",
  "algorithm": "RS256",
  "secret": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"
}

Une réponse réussie renvoie la configuration de l'appareil et l'adresse à laquelle se connecter :

{
  "status": "success",
  "data": {
    "configuration": {},
    "mqtt": { "host": "mqtts.fundamentum-iot.com", "port": 8883 }
  }
}

Si l'appareil existe déjà, POST répond :

{
  "status": "error",
  "message": "Authorization conflict",
  "data": { "error": "device already provisioned" }
}

Le reprovisionnement est toujours une étape explicite : n'utilisez PUT que si vous souhaitez réellement remplacer la clé. Voir Self-provisioning.

Le fichier de jeton du registre contient server_url, mqtt_host, mqtt_port, token, project_id, region_id et registry_id.

Appareils

Méthode Chemin Informations d'identification Objet
POST {P}/registries/{registry_id}/devices Jeton d'utilisateur Enregistrer un appareil : serial_number, name, asset_type_id
GET {P}/registries/{registry_id}/devices/{serial_number} Jeton d'utilisateur Obtenir la configuration de l'appareil
DELETE {P}/registries/{registry_id}/devices/{serial_number} Jeton d'utilisateur Supprimer l'appareil
POST {P}/registries/{registry_id}/devices/{serial_number}/set-authorization Jeton d'utilisateur Définir les informations d'identification de l'appareil : algorithm et secret
POST {P}/registries/{registry_id}/devices/{serial_number}/configuration Jeton d'utilisateur Mettre à jour configuration et/ou meta_data. Au moins l'un des deux est requis, sinon 422
POST {P}/registries/{registry_id}/devices/{serial_number}/heartbeat Jeton d'utilisateur Envoyer un heartbeat : {"uptime": <seconds>}. Un temps de fonctionnement inférieur au précédent enregistre un redémarrage
GET {P}/registries/{registry_id}/devices/{serial_number}/states Jeton d'utilisateur Obtenir les derniers états
POST {P}/registries/{registry_id}/devices/{serial_number}/telemetry JWT d'appareil Publier de la télémétrie. Le corps est du JSON libre. Renvoie {"status":"success"}

La télémétrie via HTTPS est l'alternative à MQTT pour les appareils qui ne peuvent pas maintenir une connexion ouverte. Voir HTTPS alternative.

curl -X POST "https://devices.fundamentum-iot.com/api/v3/projects/<project-id>/regions/1/registries/<registry-id>/devices/<serial-number>/telemetry" \
  -H "Authorization: Bearer $DEVICE_JWT" \
  -H "Content-Type: application/json" \
  -d '{"temperature": 21.4}'

Appareils en stock

Les appareils en stock sont préenregistrés en usine avec une clé de provisionnement, puis affectés ultérieurement à un registre. Voir Shelf devices and provisioning keys.

Méthode Chemin Informations d'identification Objet
POST {P}/asset-types/{asset_type_id}/shelf-devices Clé de provisionnement Enregistrer un appareil en stock : serial_number, secret, algorithm
GET {P}/asset-types/{asset_type_id}/shelf-devices/{serial_number} Clé de provisionnement Obtenir un appareil en stock
DELETE {P}/asset-types/{asset_type_id}/shelf-devices/{serial_number} Clé de provisionnement Supprimer un appareil en stock
POST {P}/asset-types/{asset_type_id}/shelf-devices/{serial_number}/provision Clé de provisionnement Affecter à un registre : {"registry_id": <registry-id>}. Renvoie device_id, configuration et mqtt (host, port, client_id). 422 si déjà provisionné
DELETE {P}/asset-types/{asset_type_id}/shelf-devices/{serial_number}/provision Jeton d'utilisateur Déprovisionner
GET {P}/asset-types/{asset_type_id}/shelf-devices/{serial_number}/registry-id JWT d'appareil L'appareil demande à quel registre il appartient. Renvoie registry_id, mqtt_host, mqtt_port. Renvoie 401 tant que l'appareil n'est pas affecté

Shelf device provisioning through the API

Clés de provisionnement

Méthode Chemin Informations d'identification Objet
GET {P}/provisioning-keys Jeton d'utilisateur Lister les clés actives
POST {P}/provisioning-keys Jeton d'utilisateur Créer une clé : start_at, end_at
GET {P}/provisioning-keys/{key} Jeton d'utilisateur Obtenir une clé
DELETE {P}/provisioning-keys/{key} Jeton d'utilisateur Supprimer une clé

start_at et end_at sont des dates au format YYYY-MM-DD, interprétées à minuit UTC. Une clé est active lorsque start_at ≤ maintenant < end_at. La clé elle-même est un UUID.

Numéros de série

Réponses et erreurs

Les réponses utilisent l'enveloppe status/data décrite dans Conventions.

Statut Signification
200 Succès
400 Requête invalide. data.errors énumère chaque problème avec type, msg, path et location
401 Informations d'identification manquantes ou invalides
403 Authentifié, mais non autorisé : "No permission to do this action"
404 "Resource not found"
409 Conflit, par exemple un appareil déjà provisionné
422 Échec de la validation, par exemple {"data": {"serial_number": "The serial number has already been taken"}}

Autres versions

Version Statut
v3 Version actuelle. À utiliser pour tout nouveau développement
v2 Toujours disponible à l'adresse /api/v2/... et non marquée comme abandonnée. Elle ne comporte pas d'endpoints pour les appareils en stock, les clés de provisionnement, la télémétrie ou le jeton de registre
v1 Abandonnée. Chaque route d'appareil de la v1 est marquée deprecated dans sa spécification

Chaque version publie sa spécification à l'adresse /api/{version}/swagger.json. Voir Changelog and deprecations.

Et ensuite