Delen via


Quickstart: Een Azure IoT-hub en een opslagaccount implementeren met behulp van een ARM-sjabloon

In deze quickstart gebruikt u een Azure Resource Manager-sjabloon (ARM-sjabloon) om een IoT-hub, een Azure Storage-account en een route te maken om berichten van de IoT-hub naar de opslag te verzenden. De hub is zo geconfigureerd dat de berichten die naar de hub worden verzonden, automatisch worden doorgestuurd naar het opslagaccount als ze voldoen aan de routeringsvoorwaarde. Aan het einde van deze quickstart kunt u het opslagaccount openen en de verzonden berichten bekijken.

Een Azure Resource Manager-sjabloon is een JSON-bestand (JavaScript Object Notation) dat de infrastructuur en configuratie voor uw project definieert. Voor de sjabloon is declaratieve syntaxis vereist. U beschrijft de beoogde implementatie zonder de reeks programmeeropdrachten te schrijven om de implementatie te maken.

Als uw omgeving voldoet aan de vereisten en u benkend bent met het gebruik van ARM-sjablonen, selecteert u de knop Implementeren naar Azure. De sjabloon wordt in Azure Portal geopend.

Implementeren in Azure

Vereisten

De sjabloon controleren

De sjabloon die in deze quickstart wordt gebruikt, wordt 101-iothub-auto-route-messages uit Azure-quickstartsjablonen genoemd.

Er worden twee Azure-resources gedefinieerd in de sjabloon:

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

De sjabloon implementeren

Deze sectie bevat de stappen voor het implementeren van de ARM-sjabloon.

  • Maak de resources door de ARM-sjabloon te implementeren.

    Implementeren in Azure

Apparaat-naar-cloud-berichten verzenden

In deze sectie registreert u een apparaat in uw nieuwe IoT-hub en verzendt u vervolgens berichten van dat apparaat naar IoT Hub. De route die door de sjabloon in de IoT-hub is geconfigureerd, verzendt alleen berichten naar de opslag als deze de berichteigenschap level=storagebevatten. Om te testen of deze routeringsvoorwaarde werkt zoals verwacht, verzenden we enkele berichten met die eigenschap en sommige zonder.

Tip

In deze quickstart wordt het gesimuleerde Azure CLI-apparaat gebruikt voor het gemak. Zie HubRoutingSample in de Azure IoT SDK voor .NET voor een codevoorbeeld voor het verzenden van apparaat-naar-cloud-berichten met berichteigenschappen voor routering.

  1. Haal de naam op van de IoT-hub die door de sjabloon voor u is gemaakt.

    Als u de standaardopdrachten in de vorige sectie hebt gebruikt, zijn uw resources gemaakt in de resourcegroep ContosoResourceGrp . Als u een andere resourcegroep hebt gebruikt, werkt u de volgende opdracht bij zodat deze overeenkomt.

    az iot hub list --resource-group ContosoResourceGrp --output table
    
  2. Kopieer de naam van uw IoT-hub uit de uitvoer. Deze moet worden opgemaakt als contosoHub{randomidentifier}

  3. Voeg een apparaat toe aan de hub.

    az iot hub device-identity create --device-id contosoDevice --hub-name {YourIoTHubName} 
    
  4. Simuleer het apparaat en verzend apparaat-naar-cloud-berichten.

    Met --data de parameter kunnen we de berichttekst instellen.

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

    De simulator verzendt 100 berichten en verbreekt vervolgens de verbinding. U hoeft niet te wachten op alle 100 voor deze quickstart.

    Tip

    De Azure CLI drukt de berichten niet af terwijl ze worden verzonden. Als u de berichten wilt bekijken wanneer u bij uw hub aankomt, kunt u de Azure IoT Hub-extensie voor Visual Studio Code installeren en deze gebruiken om het ingebouwde eindpunt te bewaken.

  5. Verzend apparaat-naar-cloud-berichten om naar de opslag te worden gerouteerd.

    Met --properties de parameter kunnen we bericht-, toepassings- of systeemeigenschappen toevoegen aan het standaardbericht. Voor deze quickstart is de route in uw IoT-hub op zoek naar berichten die de berichteigenschap level=storagebevatten.

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

Geïmplementeerde resources bekijken

  1. Meld u aan bij Azure Portal en selecteer de resourcegroep en selecteer vervolgens het opslagaccount.

  2. Zoom in op het opslagaccount totdat u bestanden vindt.

    De opslagaccountbestanden bekijken

  3. Selecteer een van de bestanden en selecteer Downloaden. Download het bestand naar een locatie die u later kunt vinden. Het heeft een naam die numeriek is, zoals 47. Voeg .txt toe aan het einde en dubbelklik op het bestand om het te openen.

  4. Wanneer u het bestand opent, heeft elke rij betrekking op een ander bericht. De hoofdtekst van elk bericht is ook versleuteld. Dit is nodig om query's uit te voeren op basis van de hoofdtekst van het bericht.

    De verzonden berichten weergeven

    Notitie

    Deze berichten zijn gecodeerd in UTF-32 en base64. Als u het bericht terugleest, moet u het decoderen van base64 en UTF-32 om het te kunnen lezen als ASCII. Als u geïnteresseerd bent, kunt u de methode ReadOneRowFromFile in de zelfstudie voor routering gebruiken om een van deze berichtbestanden te lezen en te decoderen naar ASCII. ReadOneRowFromFile bevindt zich in de IoT C#SDK-opslagplaats die u voor deze quickstart hebt uitgepakt. Dit is het pad boven aan die map: ./iothub/device/samples/getting started/RoutingTutorial/SimulatedDevice/Program.cs. Stel de Booleaanse waarde readTheFile in op true en codeer het pad naar het bestand op de schijf, waarna de eerste rij in het bestand wordt geopend en vertaald.

In deze quickstart hebt u een ARM-sjabloon geïmplementeerd om een IoT-hub en een opslagaccount te maken en vervolgens een programma uit te voeren om berichten naar de hub te verzenden. De berichten worden gerouteerd op basis van hun berichteigenschappen en opgeslagen in het opslagaccount waar ze kunnen worden bekeken.

Resources opschonen

Als u de resources wilt verwijderen die tijdens deze quickstart zijn toegevoegd, meldt u zich aan bij Azure Portal. Selecteer Resourcegroepen en zoek de resourcegroep die u voor deze quickstart hebt gebruikt. Selecteer de resourcegroep en selecteer vervolgens Verwijderen. Wanneer de groep wordt verwijderd, zijn dit alle resources in de groep.

Volgende stappen