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

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

Bicep — это предметно-ориентированный язык (DSL), который использует декларативный синтаксис для развертывания ресурсов Azure. Он обеспечивает краткий синтаксис, надежную безопасность типов и поддержку повторного использования кода. Bicep предлагает лучшие возможности для разработки решений Azure типа "инфраструктура как код".

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

Проверка BICEP-файла

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

В файле Bicep определено два ресурса Azure:

  • Microsoft. служба хранилища/storageAccounts: учетная запись хранения с контейнером.
  • Microsoft.Devices/IotHubs: Центр Интернета вещей с конечной точкой, указывающей на контейнер хранилища и маршрут для отправки отфильтрованных сообщений в ту конечную точку.
@description('Define the project name or prefix for all objects.')
@minLength(1)
@maxLength(11)
param projectName string = 'contoso'

@description('The datacenter to use for the deployment.')
param location string = resourceGroup().location

@description('The SKU to use for the IoT Hub.')
param skuName string = 'S1'

@description('The number of IoT Hub units.')
param skuUnits int = 1

@description('Partitions used for the event stream.')
param d2cPartitions int = 4

var iotHubName = '${projectName}Hub${uniqueString(resourceGroup().id)}'
var storageAccountName = '${toLower(projectName)}${uniqueString(resourceGroup().id)}'
var storageEndpoint = '${projectName}StorageEndpont'
var storageContainerName = '${toLower(projectName)}results'

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'Storage'
  properties: {
    allowBlobPublicAccess: false
    minimumTlsVersion: 'TLS1_2'
    supportsHttpsTrafficOnly: true
  }
}

resource container 'Microsoft.Storage/storageAccounts/blobServices/containers@2023-01-01' = {
  name: '${storageAccountName}/default/${storageContainerName}'
  properties: {
    publicAccess: 'None'
  }
  dependsOn: [
    storageAccount
  ]
}

resource IoTHub 'Microsoft.Devices/IotHubs@2023-06-30' = {
  name: iotHubName
  location: location
  sku: {
    name: skuName
    capacity: skuUnits
  }
  properties: {
    eventHubEndpoints: {
      events: {
        retentionTimeInDays: 1
        partitionCount: d2cPartitions
      }
    }
    routing: {
      endpoints: {
        storageContainers: [
          {
            connectionString: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
            containerName: storageContainerName
            fileNameFormat: '{iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm}'
            batchFrequencyInSeconds: 100
            maxChunkSizeInBytes: 104857600
            encoding: 'JSON'
            name: storageEndpoint
          }
        ]
      }
      routes: [
        {
          name: 'ContosoStorageRoute'
          source: 'DeviceMessages'
          condition: 'level="storage"'
          endpointNames: [
            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
      }
    }
  }
}

output name string = IoTHub.name
output resourceId string = IoTHub.id
output resourceGroupName string = resourceGroup().name
output location string = location

Развертывание BICEP-файла

В этом разделе приведены шаги по развертыванию Bicep-файла.

  1. Скачайте файл main.bicep из репозитория шаблонов быстрого запуска Azure.

  2. Создайте ресурсы, развернув файл Bicep с помощью Azure CLI.

    az group create --name ContosoResourceGrp --location eastus
    az deployment group create --resource-group exampleRG --template-file main.bicep
    

    Развертывание занимает несколько минут. После завершения развертывания вы увидите выходные данные, подробные сведения о развернутых ресурсах.

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

В этом разделе описана регистрация устройства в новом центре Интернета вещей, а затем отправка сообщений с этого устройства в Центр Интернета вещей. Маршрут, настроенный в файле Bicep в Центре Интернета вещей, отправляет только сообщения в хранилище, если он содержит свойство 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-8 и base64. Если вы читаете сообщение обратно, необходимо декодировать его из base64 и utf-8, чтобы прочитать его как ASCII. Если вам это интересно, вы можете использовать метод ReadOneRowFromFile, описанный в учебнике по маршрутизации, чтобы считать сообщение, содержащееся в одном из этих файлов, и декодировать его в ASCII. ReadOneRowFromFile находится в репозитории пакета SDK для Интернета вещей C#, который вы распаковали для этого краткого руководства. Ниже приведен путь из верхней части этой папки: ./iothub/device/samples/how to guides/HubRoutingSample/Program.cs Set the boolean readTheFile to true, and hardcode the path to the file on disk, and it open and translate the first row in the file.

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

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

Если созданные ресурсы вам больше не нужны, удалите их.

az group delete --name exampleRG

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