Краткое руководство. Развертывание Центра Интернета вещей Azure и учетной записи хранения с помощью шаблона ARM

В этом кратком руководстве вы используете шаблон Azure Resource Manager (шаблон ARM) для создания центра Интернета вещей, учетной записи служба хранилища Azure и маршрута для отправки сообщений из Центра Интернета вещей в хранилище. Центр настроен таким образом, чтобы сообщения, отправленные в концентратор, автоматически перенаправлялись в учетную запись хранения, если они соответствуют условию маршрутизации. После выполнения инструкций этого краткого руководства вы сможете открыть учетную запись хранения и просмотреть отправленные сообщения.

Шаблон Azure Resource Manager — это файл нотации объектов JavaScript (JSON), который определяет инфраструктуру и конфигурацию проекта. В шаблоне используется декларативный синтаксис. Вы описываете предполагаемое развертывание без написания последовательности команд программирования для создания развертывания.

Если среда соответствует предварительным требованиям и вы знакомы с использованием шаблонов ARM, нажмите кнопку Развертывание в Azure. На портале Azure откроется шаблон.

Deploy To Azure

Необходимые компоненты

Изучение шаблона

Шаблон, используемый в этом кратком руководстве, называется 101-iothub-auto-route-messages и взят из шаблонов быстрого запуска Azure.

В шаблоне определено два ресурса Azure:

  • Microsoft. служба хранилища/storageAccounts: учетная запись хранения с контейнером.
  • Microsoft.Devices/IotHubs: Центр Интернета вещей с конечной точкой, указывающей на контейнер хранилища и маршрут для отправки отфильтрованных сообщений в ту конечную точку.
{
  "$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')]"
    }
  }
}

Развертывание шаблона

В этом разделе приведены шаги по развертыванию шаблона ARM.

  • Создайте ресурсы, развернув шаблон ARM.

    Deploy To Azure

Отправка сообщений устройства в облако

В этом разделе описана регистрация устройства в новом центре Интернета вещей, а затем отправка сообщений с этого устройства в Центр Интернета вещей. Маршрут, настроенный в центре Интернета вещей, отправляет только сообщения в хранилище, если он содержит свойство level=storageсообщения. Чтобы проверить, работает ли это условие маршрутизации должным образом, мы отправим некоторые сообщения с этим свойством и некоторыми без этого свойства.

Совет

В этом кратком руководстве для удобства используется имитированное устройство Azure CLI. Пример кода отправки сообщений в облако с свойствами сообщений для маршрутизации см. в статье HubRoutingSample в пакете SDK Интернета вещей Azure для .NET.

  1. Получите имя Центра Интернета вещей, созданного шаблоном.

    Если вы использовали команды по умолчанию в предыдущем разделе, ресурсы были созданы в группе ресурсов ContosoResourceGrp . Если вы использовали другую группу ресурсов, обновите следующую команду, чтобы соответствовать.

    az iot hub list --resource-group ContosoResourceGrp --output table
    
  2. Скопируйте имя центра Интернета вещей из выходных данных. Оно должно быть отформатировано следующим образом. contosoHub{randomidentifier}

  3. Добавьте устройство в концентратор.

    az iot hub device-identity create --device-id contosoDevice --hub-name {YourIoTHubName} 
    
  4. Имитируйте устройство и отправляйте сообщения из устройства в облако.

    Параметр --data позволяет задать текст сообщения.

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

    Симулятор отправляет 100 сообщений, а затем отключается. Вам не нужно ждать всех 100 для целей этого краткого руководства.

    Совет

    Azure CLI не печатает сообщения по мере их отправки. Если вы хотите просмотреть сообщения по мере поступления в центр, можно установить расширение Центр Интернета вещей Azure для Visual Studio Code и использовать его для мониторинга встроенной конечной точки.

  5. Отправка сообщений из устройства в облако для маршрутизации в хранилище.

    Параметр --properties позволяет добавлять сообщения, приложения или системные свойства в сообщение по умолчанию. В этом кратком руководстве маршрут в Центре Интернета вещей ищет сообщения, содержащие свойство level=storageсообщения.

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

Просмотр развернутых ресурсов

  1. Войдите в портал Azure и выберите группу ресурсов, а затем выберите учетную запись хранения.

  2. Детализируйте учетную запись хранения до тех пор, пока не найдете файлы.

    Look at the storage account files

  3. Выберите один из файлов, нажмите Скачать и скачайте файл в расположение, которое сможете найти позже. Он имеет имя, которое числовое, например 47. Добавьте .txt в конец файла, а затем дважды щелкните его, чтобы открыть.

  4. В открывшемся файле каждая строка предназначена для отдельного сообщения. Кроме того, текст каждого сообщения зашифрован. Для выполнения запросов по тексту сообщения порядок должен оставаться неизменным.

    View the sent messages

    Примечание.

    Для этих сообщений используется кодировка UTF-32 и Base64. Если вам необходимо считать сообщение в кодировке ASCII, его необходимо декодировать из Base64 и UTF-32. Если вам это интересно, вы можете использовать метод ReadOneRowFromFile, описанный в учебнике по маршрутизации, чтобы считать сообщение, содержащееся в одном из этих файлов, и декодировать его в ASCII. ReadOneRowFromFile находится в репозитории пакета SDK для Интернета вещей C#, который вы распаковали для этого краткого руководства. Ниже приведен путь из верхней части этой папки: ./iothub/device/samples/getting started/RoutingTutorial/SimulatedDevice/Program.cs. Задайте логическое readTheFile значение true и закодировать путь к файлу на диске, и откроется и преобразует первую строку в файле.

В этом кратком руководстве вы развернули шаблон ARM для создания Центра Интернета вещей и учетной записи хранения, а затем запустите программу для отправки сообщений в центр. Сообщения направляются на основе их свойств сообщения и хранятся в учетной записи хранения, где их можно просмотреть.

Очистка ресурсов

Чтобы удалить ресурсы, добавленные во время этого краткого руководства, войдите в портал Azure. Выберите Группы ресурсов, а затем найдите группу ресурсов, используемую для этого краткого руководства. Выберите группу ресурсов, а затем щелкните Удалить. При удалении группы все ресурсы в группе.

Следующие шаги