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.
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é |
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
- Lettres minuscules, chiffres,
-et_. - Uniques au sein d'un registre, et comparés sans tenir compte de la casse.
- Les identifiants de type d'actif sont des entiers positifs. Les valeurs négatives sont réservées.
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.