Partager via


Démarrage rapide : Déployer un hub Azure IoT et un compte de stockage à l'aide d'un modèle ARM

Dans ce guide de démarrage rapide, vous utilisez un modèle Azure Resource Manager (modèle ARM) pour créer un hub IoT, un compte de stockage Azure, et un itinéraire pour envoyer des messages du hub IoT au stockage. Le hub est configuré de sorte que les messages qui lui sont envoyés sont automatiquement routés vers le compte de stockage s’ils remplissent la condition de routage. À la fin de ce guide de démarrage rapide, vous pouvez ouvrir le compte de stockage et voir les messages envoyés.

Un modèle Azure Resource Manager est un fichier JSON (JavaScript Object Notation) qui définit l’infrastructure et la configuration de votre projet. Le modèle utilise la syntaxe déclarative. Vous décrivez votre déploiement prévu sans écrire la séquence de commandes de programmation pour créer le déploiement.

Si votre environnement remplit les prérequis et que vous êtes déjà familiarisé avec l’utilisation des modèles ARM, sélectionnez le bouton Déployer sur Azure. Le modèle s’ouvre dans le portail Azure.

Déployer dans Azure

Prérequis

Vérifier le modèle

Le modèle utilisé dans ce guide de démarrage rapide est appelé 101-iothub-auto-route-messages et provient des modèles de démarrage rapide Azure.

Deux ressources Azure sont définies dans le modèle :

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.26.54.24096",
      "templateHash": "1111741482289134864"
    }
  },
  "parameters": {
    "projectName": {
      "type": "string",
      "defaultValue": "contoso",
      "minLength": 1,
      "maxLength": 11,
      "metadata": {
        "description": "Define the project name or prefix for all objects."
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "The datacenter to use for the deployment."
      }
    },
    "skuName": {
      "type": "string",
      "defaultValue": "S1",
      "metadata": {
        "description": "The SKU to use for the IoT Hub."
      }
    },
    "skuUnits": {
      "type": "int",
      "defaultValue": 1,
      "metadata": {
        "description": "The number of IoT Hub units."
      }
    },
    "d2cPartitions": {
      "type": "int",
      "defaultValue": 4,
      "metadata": {
        "description": "Partitions used for the event stream."
      }
    }
  },
  "variables": {
    "iotHubName": "[format('{0}Hub{1}', parameters('projectName'), uniqueString(resourceGroup().id))]",
    "storageAccountName": "[format('{0}{1}', toLower(parameters('projectName')), uniqueString(resourceGroup().id))]",
    "storageEndpoint": "[format('{0}StorageEndpont', parameters('projectName'))]",
    "storageContainerName": "[format('{0}results', toLower(parameters('projectName')))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "properties": {
        "allowBlobPublicAccess": false,
        "minimumTlsVersion": "TLS1_2",
        "supportsHttpsTrafficOnly": true
      }
    },
    {
      "type": "Microsoft.Storage/storageAccounts/blobServices/containers",
      "apiVersion": "2023-01-01",
      "name": "[format('{0}/default/{1}', variables('storageAccountName'), variables('storageContainerName'))]",
      "properties": {
        "publicAccess": "None"
      },
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.Devices/IotHubs",
      "apiVersion": "2023-06-30",
      "name": "[variables('iotHubName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('skuName')]",
        "capacity": "[parameters('skuUnits')]"
      },
      "properties": {
        "eventHubEndpoints": {
          "events": {
            "retentionTimeInDays": 1,
            "partitionCount": "[parameters('d2cPartitions')]"
          }
        },
        "routing": {
          "endpoints": {
            "storageContainers": [
              {
                "connectionString": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', variables('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2023-01-01').keys[0].value)]",
                "containerName": "[variables('storageContainerName')]",
                "fileNameFormat": "{iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm}",
                "batchFrequencyInSeconds": 100,
                "maxChunkSizeInBytes": 104857600,
                "encoding": "JSON",
                "name": "[variables('storageEndpoint')]"
              }
            ]
          },
          "routes": [
            {
              "name": "ContosoStorageRoute",
              "source": "DeviceMessages",
              "condition": "level=\"storage\"",
              "endpointNames": [
                "[variables('storageEndpoint')]"
              ],
              "isEnabled": true
            }
          ],
          "fallbackRoute": {
            "name": "$fallback",
            "source": "DeviceMessages",
            "condition": "true",
            "endpointNames": [
              "events"
            ],
            "isEnabled": true
          }
        },
        "messagingEndpoints": {
          "fileNotifications": {
            "lockDurationAsIso8601": "PT1M",
            "ttlAsIso8601": "PT1H",
            "maxDeliveryCount": 10
          }
        },
        "enableFileUploadNotifications": false,
        "cloudToDevice": {
          "maxDeliveryCount": 10,
          "defaultTtlAsIso8601": "PT1H",
          "feedback": {
            "lockDurationAsIso8601": "PT1M",
            "ttlAsIso8601": "PT1H",
            "maxDeliveryCount": 10
          }
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    }
  ],
  "outputs": {
    "name": {
      "type": "string",
      "value": "[variables('iotHubName')]"
    },
    "resourceId": {
      "type": "string",
      "value": "[resourceId('Microsoft.Devices/IotHubs', variables('iotHubName'))]"
    },
    "resourceGroupName": {
      "type": "string",
      "value": "[resourceGroup().name]"
    },
    "location": {
      "type": "string",
      "value": "[parameters('location')]"
    }
  }
}

Déployer le modèle

Cette section décrit les étapes de déploiement du modèle ARM.

  • Créez les ressources en déployant le modèle ARM.

    Déployer sur Azure

Envoyer des messages appareil-à-cloud

Dans cette section, vous inscrivez un appareil dans votre nouveau hub IoT, puis envoyez des messages de cet appareil au hub IoT. L’itinéraire que le modèle a configuré dans le hub IoT envoie uniquement des messages au stockage s’ils contiennent la propriété de message level=storage. Pour tester que cette condition de routage fonctionne comme prévu, nous allons envoyer des messages avec cette propriété et d’autres sans elle.

Conseil

Ce guide de démarrage rapide utilise l’appareil simulé Azure CLI pour des raisons pratiques. Pour obtenir un exemple de code d’envoi de messages appareil-à-cloud avec des propriétés de message pour le routage, consultez HubRoutingSample dans le Kit de développement logiciel (SDK) Azure IoT pour .NET.

  1. Récupérez le nom du hub IoT que le modèle a créé pour vous.

    Si vous avez utilisé les commandes par défaut dans la section précédente, vos ressources ont été créées dans le groupe de ressources ContosoResourceGrp . Si vous avez utilisé un autre groupe de ressources, mettez à jour la commande suivante pour qu’elle y corresponde.

    az iot hub list --resource-group ContosoResourceGrp --output table
    
  2. Copiez le nom de votre hub IoT à partir de la sortie. Le format utilisé devrait être le suivant : contosoHub{randomidentifier}

  3. Ajoutez un appareil au hub.

    az iot hub device-identity create --device-id contosoDevice --hub-name {YourIoTHubName} 
    
  4. Simulez l’appareil et envoyez des messages appareil-à-cloud.

    Le paramètre --data nous permet de définir le corps du message.

    az iot device simulate \
      --device-id contosoDevice \
      --hub-name {YourIoTHubName} \
      --data "This message won't be routed."
    

    Le simulateur envoie 100 messages, puis se déconnecte. Dans le cadre de ce démarrage rapide, vous n’avez pas besoin d’attendre l’envoi de la totalité des messages.

    Conseil

    Azure CLI n’imprime pas les messages à mesure qu’il les envoie. Si vous souhaitez surveiller les messages au fur et à mesure qu’ils arrivent à votre hub, vous pouvez installer l’extension Azure IoT Hub pour Visual Studio Code et l’utiliser pour surveiller le point de terminaison intégré.

  5. Envoyer des messages appareil-à-cloud à router vers le stockage.

    Le paramètre --properties nous permet d’ajouter des propriétés système, application ou message au message par défaut. Pour ce guide de démarrage rapide, l’itinéraire dans votre hub IoT recherche des messages qui contiennent la propriété de message level=storage.

    az iot device simulate \
      --device-id contosoDevice \
      --hub-name {YourIoTHubName} \
      --properties level=storage \
      --data "This message will be routed to storage."
    

Vérifier les ressources déployées

  1. Connectez-vous au Portail Azure, sélectionnez le groupe de ressources, puis sélectionnez le compte de stockage.

  2. Explorez le compte de stockage jusqu’à trouver les fichiers.

    Examiner les fichiers du compte de stockage

  3. Sélectionnez un des fichiers et sélectionnez Télécharger, puis téléchargez le fichier à un emplacement que vous pouvez retrouver ultérieurement. Son nom est un nombre, par exemple 47. Ajoutez .txt à la fin, puis double-cliquez sur le fichier pour l’ouvrir.

  4. Quand vous ouvrez le fichier, chaque ligne correspond à un message différent ; le corps de chaque message est chiffré. Il doit vous permettre d’effectuer des requêtes sur le corps du message.

    Voir les messages envoyés

    Notes

    Ces messages sont encodés au format UTF-32 et base64. Si vous relisez le message, vous devez le décoder depuis base64 et UTF-32 pour pouvoir lire au format ASCII. Si vous êtes intéressé, vous pouvez utiliser la méthode ReadOneRowFromFile du tutoriel Routage pour en lire un depuis un de ces fichiers de messages et le décoder en ASCII. ReadOneRowFromFile se trouve dans le référentiel du Kit de développement logiciel (SDK) C# IoT que vous avez décompressé pour ce démarrage rapide. Voici le chemin d’accès à partir du haut de ce dossier : ./iothub/device/samples/getting started/RoutingTutorial/SimulatedDevice/Program.cs. Affectez la valeur true à la valeur booléenne readTheFile et codez en dur le chemin d’accès au fichier sur le disque. Il ouvrira et traduira la première ligne du fichier.

Dans ce guide de démarrage rapide, Vous avez déployé un modèle ARM pour créer un hub IoT et un compte de stockage, puis vous avez exécuté un programme pour envoyer des messages au hub. Les messages sont routés en fonction de leurs propriétés de message et stockés dans le compte de stockage où ils peuvent être affichés.

Nettoyer les ressources

Pour supprimer les ressources ajoutées au cours de ce démarrage rapide, identifiez-vous au portail Azure. Sélectionnez Groupes de ressources, puis recherchez le groupe de ressources utilisé pour ce guide de démarrage rapide. Sélectionnez le nom du groupe de ressources, puis sélectionnez Supprimer. Lorsque le groupe est supprimé, il en est de même pour toutes les ressources du groupe.

Étapes suivantes