Szybki start: wdrażanie centrum Azure IoT Hub i konta magazynu przy użyciu szablonu usługi ARM

W tym przewodniku Szybki start użyjesz szablonu usługi Azure Resource Manager (szablonu usługi ARM), aby utworzyć centrum IoT Hub, konto usługi Azure Storage i trasę do wysyłania komunikatów z centrum IoT do magazynu. Koncentrator jest skonfigurowany, aby komunikaty wysyłane do centrum były automatycznie kierowane do konta magazynu, jeśli spełniają warunek routingu. Na końcu tego przewodnika Szybki start możesz otworzyć konto magazynu i zobaczyć wysłane komunikaty.

Szablon usługi Azure Resource Manager to plik JavaScript Object Notation (JSON), który definiuje infrastrukturę i konfigurację projektu. W szablonie używana jest składnia deklaratywna. Możesz opisać zamierzone wdrożenie bez konieczności pisania sekwencji poleceń programowania w celu utworzenia wdrożenia.

Jeśli Twoje środowisko spełnia wymagania wstępne i masz doświadczenie w korzystaniu z szablonów ARM, wybierz przycisk Wdróż na platformie Azure. Szablon zostanie otwarty w witrynie Azure Portal.

Deploy To Azure

Wymagania wstępne

Przegląd szablonu

Szablon używany w tym przewodniku Szybki start jest wywoływany 101-iothub-auto-route-messages z szablonów szybkiego startu platformy Azure.

Dwa zasoby platformy Azure są zdefiniowane w szablonie:

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

Wdrażanie szablonu

Ta sekcja zawiera kroki wdrażania szablonu usługi ARM.

  • Utwórz zasoby, wdrażając szablon usługi ARM.

    Deploy To Azure

Wysyłanie komunikatów z urządzenia do chmury

W tej sekcji zarejestrujesz urządzenie w nowym centrum IoT, a następnie wyślesz komunikaty z tego urządzenia do usługi IoT Hub. Trasa skonfigurowana w usłudze IoT Hub wysyła komunikaty tylko do magazynu, jeśli zawierają właściwość level=storagekomunikatu . Aby przetestować, czy ten warunek routingu działa zgodnie z oczekiwaniami, wyślemy kilka komunikatów z tą właściwością i niektóre bez.

Napiwek

Ten przewodnik Szybki start używa symulowanego urządzenia interfejsu wiersza polecenia platformy Azure dla wygody. Aby zapoznać się z przykładem kodu wysyłania komunikatów z urządzenia do chmury z właściwościami komunikatów na potrzeby routingu, zobacz HubRoutingSample w zestawie SDK usługi Azure IoT dla platformy .NET.

  1. Pobierz nazwę centrum IoT hub utworzonego dla Ciebie szablonu.

    Jeśli w poprzedniej sekcji użyto poleceń domyślnych, zasoby zostały utworzone w grupie zasobów ContosoResourceGrp . Jeśli użyto innej grupy zasobów, zaktualizuj następujące polecenie, aby było zgodne.

    az iot hub list --resource-group ContosoResourceGrp --output table
    
  2. Skopiuj nazwę centrum IoT Hub z danych wyjściowych. Powinien być sformatowany tak, jak contosoHub{randomidentifier}

  3. Dodaj urządzenie do centrum.

    az iot hub device-identity create --device-id contosoDevice --hub-name {YourIoTHubName} 
    
  4. Symulowanie urządzenia i wysyłanie komunikatów z urządzenia do chmury.

    Parametr --data pozwala nam ustawić treść komunikatu.

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

    Symulator wysyła 100 komunikatów, a następnie rozłącza się. Nie musisz czekać na wszystkie 100 na potrzeby tego przewodnika Szybki start.

    Napiwek

    Interfejs wiersza polecenia platformy Azure nie będzie drukować komunikatów podczas ich wysyłania. Jeśli chcesz oglądać komunikaty po nadejściu do centrum, możesz zainstalować rozszerzenie usługi Azure IoT Hub dla programu Visual Studio Code i użyć go do monitorowania wbudowanego punktu końcowego.

  5. Wysyłanie komunikatów z urządzenia do chmury, które mają być kierowane do magazynu.

    Parametr --properties umożliwia dodawanie właściwości komunikatu, aplikacji lub systemu do komunikatu domyślnego. Na potrzeby tego przewodnika Szybki start trasa w centrum IoT szuka komunikatów zawierających właściwość level=storagekomunikatu .

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

Przeglądanie wdrożonych zasobów

  1. Zaloguj się do witryny Azure Portal i wybierz grupę zasobów, a następnie wybierz konto magazynu.

  2. Przejdź do szczegółów konta magazynu, dopóki nie znajdziesz plików.

    Look at the storage account files

  3. Wybierz jeden z plików i wybierz pozycję Pobierz i pobierz plik do lokalizacji, którą możesz znaleźć później. Ma ona nazwę liczbową, na przykład 47. Dodaj .txt na końcu, a następnie kliknij dwukrotnie plik, aby go otworzyć.

  4. Po otwarciu pliku każdy wiersz jest przeznaczony dla innego komunikatu; Treść każdej wiadomości jest również szyfrowana. Aby można było wykonywać zapytania względem treści komunikatu, musi to być konieczne.

    View the sent messages

    Uwaga

    Te komunikaty są kodowane w formacie UTF-32 i base64. Jeśli odczytujesz komunikat z powrotem, musisz zdekodować go z base64 i utf-32, aby odczytać go jako ASCII. Jeśli cię interesuje, możesz użyć metody ReadOneRowFromFile w samouczku routingu, aby odczytać go z jednego z tych plików wiadomości i zdekodować go do ASCII. ReadOneRowFromFile znajduje się w repozytorium zestawu SDK języka C# IoT, które zostało rozpakowane na potrzeby tego przewodnika Szybki start. Oto ścieżka z góry tego folderu: ./iothub/device/samples/getting started/RoutingTutorial/SimulatedDevice/Program.cs. Ustaw wartość logiczną readTheFile na true i zakoduj ścieżkę do pliku na dysku, a następnie otworzy i przetłumaczy pierwszy wiersz w pliku.

W tym przewodniku Szybki start wdrożono szablon usługi ARM, aby utworzyć centrum IoT Hub i konto magazynu, a następnie uruchomić program do wysyłania komunikatów do centrum. Komunikaty są kierowane na podstawie ich właściwości komunikatów i przechowywane na koncie magazynu, na którym można je wyświetlić.

Czyszczenie zasobów

Aby usunąć zasoby dodane podczas tego przewodnika Szybki start, zaloguj się do witryny Azure Portal. Wybierz pozycję Grupy zasobów, a następnie znajdź grupę zasobów używaną na potrzeby tego przewodnika Szybki start. Wybierz grupę zasobów, a następnie wybierz pozycję Usuń. Po usunięciu grupy są więc wszystkie zasoby w grupie.

Następne kroki