Share via


Schnellstart: Bereitstellen einer Azure IoT-Hub-Instanz und eines Speicherkontos mithilfe einer ARM-Vorlage

In dieser Schnellstartanleitung verwenden Sie eine ARM-Vorlage (Azure Resource Manager), um einen IoT-Hub, ein Azure Storage-Speicherkonto und eine Route zu erstellen, um Nachrichten vom IoT-Hub an den Speicher zu senden. Der Hub ist so konfiguriert, dass die an den Hub gesendeten Nachrichten automatisch an das Speicherkonto weitergeleitet werden, sofern sie die Weiterleitungsbedingung erfüllen. Am Ende dieser Schnellstartanleitung können Sie das Speicherkonto öffnen und die gesendeten Nachrichten anzeigen.

Eine Azure Resource Manager-Vorlage ist eine JSON (JavaScript Object Notation)-Datei, welche die Infrastruktur und die Konfiguration für Ihr Projekt definiert. Die Vorlage verwendet eine deklarative Syntax. Sie beschreiben Ihre geplante Bereitstellung, ohne die Abfolge der Programmierbefehle zum Erstellen der Bereitstellung zu schreiben.

Wenn Ihre Umgebung die Voraussetzungen erfüllt und Sie mit der Verwendung von ARM-Vorlagen vertraut sind, klicken Sie auf die Schaltfläche In Azure bereitstellen. Die Vorlage wird im Azure-Portal geöffnet.

Deploy To Azure

Voraussetzungen

  • Wenn Sie über kein Azure-Abonnement verfügen, können Sie ein kostenloses Azure-Konto erstellen, bevor Sie beginnen.

Überprüfen der Vorlage

Die in dieser Schnellstartanleitung verwendete Vorlage stammt aus den Azure-Schnellstartvorlagen und heißt 101-iothub-auto-route-messages.

Zwei Azure-Ressourcen sind in der Vorlage definiert:

{
  "$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')]"
    }
  }
}

Bereitstellen der Vorlage

In diesem Abschnitt werden die Schritte zum Erstellen der ARM-Vorlage beschrieben.

  • Erstellen Sie die Ressourcen, indem Sie die ARM-Vorlage bereitstellen.

    Deploy To Azure

Senden von Gerät-zu-Cloud (D2C)-Nachrichten

In diesem Abschnitt registrieren Sie ein Gerät in Ihrem neuen IoT-Hub und senden dann Nachrichten von diesem Gerät an den IoT-Hub. Die Route, die die Vorlage im IoT-Hub konfiguriert hat, sendet nur Nachrichten an den Speicher, wenn sie die Nachrichteneigenschaft level=storage enthalten. Um zu testen, dass diese Weiterleitungsbedingung wie erwartet funktioniert, senden wir einige Nachrichten mit dieser Eigenschaft und einige ohne diese Eigenschaft.

Tipp

Der Einfachheit halber wird in dieser Schnellstartanleitung das simulierte Azure CLI-Gerät verwendet. Ein Codebeispiel zum Senden von Gerät-zu-Cloud-Nachrichten mit Nachrichteneigenschaften für die Weiterleitung finden Sie unter HubRoutingSample im Azure IoT-SDK für .NET.

  1. Rufen Sie den Namen des IoT-Hubs ab, den die Vorlage für Sie erstellt hat.

    Wenn Sie die Standardbefehle im vorherigen Abschnitt verwendet haben, wurden Ihre Ressourcen in der Ressourcengruppe ContosoResourceGrp erstellt. Wenn Sie eine andere Ressourcengruppe verwendet haben, ändern Sie den folgenden Befehl entsprechend.

    az iot hub list --resource-group ContosoResourceGrp --output table
    
  2. Kopieren Sie den Namen Ihres IoT-Hubs aus der Ausgabe. Er sollte folgendermaßen formatiert sein: contosoHub{randomidentifier}.

  3. Fügen Sie dem Hub ein Gerät hinzu.

    az iot hub device-identity create --device-id contosoDevice --hub-name {YourIoTHubName} 
    
  4. Simulieren Sie das Gerät, und senden Sie Gerät-zu-Cloud-Nachrichten.

    Mit dem Parameter --data kann der Nachrichtentext festgelegt werden.

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

    Der Simulator sendet 100 Nachrichten und trennt dann die Verbindung. Bei dieser Schnellstartanleitung müssen Sie nicht auf alle 100 warten.

    Tipp

    Die Azure CLI druckt die Nachrichten nicht beim Senden. Wenn Sie die Nachrichten ansehen möchten, wenn sie bei Ihrem Hub eingehen, können Sie die Azure IoT Hub-Erweiterung für Visual Studio Code installieren und verwenden, um den integrierten Endpunkt zu überwachen.

  5. Senden Sie Gerät-zu-Cloud-Nachrichten, die an den Speicher weitergeleitet werden sollen.

    Mit dem Parameter --properties können der Standardnachricht Nachrichten-, Anwendungs- oder Systemeigenschaften hinzugefügt werden. Für diese Schnellstartanleitung sucht die Route in Ihrem IoT-Hub nach Nachrichten, die die Nachrichteneigenschaft level=storage enthalten.

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

Überprüfen der bereitgestellten Ressourcen

  1. Melden Sie sich beim Azure-Portal an, und wählen Sie die Ressourcengruppe und dann das Speicherkonto aus.

  2. Führen Sie einen Drilldown für das Speicherkonto aus, bis Sie zu Dateien gelangen.

    Look at the storage account files

  3. Wählen Sie eine der Dateien und anschließend Herunterladen aus, um die Datei an einen Speicherort herunterzuladen, den Sie später leicht finden. Sie hat einen numerischen Namen, wie „47“. Fügen Sie am Ende .txt hinzu, und doppelklicken Sie auf die Datei, um sie zu öffnen.

  4. In der Datei steht jede Zeile für eine andere Nachricht, und der Nachrichtentext ist verschlüsselt. Das muss so sein, damit Sie Abfragen für den Nachrichtentext durchführen können.

    View the sent messages

    Hinweis

    Diese Nachrichten sind in UTF-32 und Base64 codiert. Wenn Sie die Nachricht auslesen, müssen Sie sie aus Base64 und UTF-32 decodieren, um sie im ASCII-Format lesen zu können. Bei Interesse können Sie die Methode „ReadOneRowFromFile“ aus dem Routingtutorial verwenden, um eine einzelne Zeile aus einer dieser Nachrichtendateien zu lesen und in ASCII zu decodieren. „ReadOneRowFromFile“ befindet sich in dem IoT C#-SDK-Repository, das Sie für diesen Schnellstart entzippt haben. Hier ist der Pfad vom Anfang dieses Ordners: ./iothub/device/samples/getting started/RoutingTutorial/SimulatedDevice/Program.cs. Legen Sie den booleschen Wert readTheFile auf „true“ (wahr) fest, und codieren Sie den Pfad zur Datei auf dem Datenträger hart. Dadurch wird die erste Zeile in der Datei geöffnet und übersetzt.

In dieser Schnellstartanleitung haben Sie eine ARM-Vorlage bereitgestellt, um einen IoT-Hub und ein Speicherkonto zu erstellen. Dann haben Sie ein Programm ausgeführt, um Nachrichten an den Hub zu senden. Die Nachrichten werden basierend auf ihren Nachrichteneigenschaften weitergeleitet und im Speicherkonto gespeichert, in dem sie angezeigt werden können.

Bereinigen von Ressourcen

Melden Sie sich zum Entfernen der in dieser Schnellstartanleitung hinzugefügten Ressourcen beim Azure-Portal an. Wählen Sie Ressourcengruppen aus, und navigieren Sie zu der in dieser Schnellstartanleitung verwendeten Ressourcengruppe. Wählen Sie die Ressourcengruppe und anschließend Löschen aus. Wenn die Gruppe gelöscht wird, werden auch alle Ressourcen in der Gruppe gelöscht.

Nächste Schritte