Share via


Guia de início rápido: implantar um hub IoT do Azure e uma conta de armazenamento usando o Bicep

Neste início rápido, você usa o Bicep para criar um hub IoT, uma conta de Armazenamento do Azure e uma rota para enviar mensagens do hub IoT para o armazenamento. O hub é configurado para que as mensagens enviadas para o hub sejam automaticamente roteadas para a conta de armazenamento se atenderem à condição de roteamento. No final deste início rápido, você pode abrir a conta de armazenamento e ver as mensagens enviadas.

O Bicep é uma linguagem específica do domínio que utiliza sintaxe declarativa para implementar recursos do Azure. Fornece sintaxe concisa, segurança de tipos fiável e suporte para reutilização de código. O Bicep oferece a melhor experiência de criação para suas soluções de infraestrutura como código no Azure.

Pré-requisitos

Revise o arquivo Bicep

O arquivo Bicep usado neste início rápido é chamado 101-iothub-auto-route-messages de Modelos de Início Rápido do Azure.

Dois recursos do Azure são definidos no arquivo Bicep:

@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

Implantar o arquivo Bicep

Esta seção fornece as etapas para implantar o arquivo Bicep.

  1. Baixe o arquivo main.bicep do repositório Modelos de Início Rápido do Azure.

  2. Crie os recursos implantando o arquivo Bicep usando a CLI do Azure.

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

    A conclusão da implementação demora vários minutos. Quando a implantação terminar, você verá a saída detalhando os recursos implantados.

Enviar mensagens do dispositivo para a nuvem

Nesta seção, você registra um dispositivo em seu novo hub IoT e, em seguida, envia mensagens desse dispositivo para o Hub IoT. A rota que o arquivo Bicep configurado no hub IoT só envia mensagens para o armazenamento se elas contiverem a propriedade level=storagemessage . Para testar se essa condição de roteamento funciona conforme o esperado, enviaremos algumas mensagens com essa propriedade e outras sem.

Gorjeta

Este guia de início rápido usa o dispositivo simulado da CLI do Azure para conveniência. Para obter um exemplo de código de envio de mensagens de dispositivo para nuvem com propriedades de mensagem para roteamento, consulte HubRoutingSample no SDK do Azure IoT para .NET.

  1. Recupere o nome do hub IoT que o modelo criou para você.

    Se você usou os comandos padrão na seção anterior, seus recursos foram criados no grupo de recursos ContosoResourceGrp . Se você usou um grupo de recursos diferente, atualize o comando a seguir para corresponder.

    az iot hub list --resource-group ContosoResourceGrp --output table
    
  2. Copie o nome do seu hub IoT da saída. Deve ser formatado como contosoHub{randomidentifier}

  3. Adicione um dispositivo ao hub.

    az iot hub device-identity create --device-id contosoDevice --hub-name {YourIoTHubName} 
    
  4. Simule o dispositivo e envie mensagens do dispositivo para a nuvem.

    O --data parâmetro nos permite definir o corpo da mensagem.

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

    O simulador envia 100 mensagens e, em seguida, desconecta. Você não precisa esperar por todos os 100 para os fins deste início rápido.

    Gorjeta

    A CLI do Azure não imprimirá as mensagens à medida que as envia. Se quiser observar as mensagens à medida que chegam ao seu hub, você pode instalar a extensão do Hub IoT do Azure para Visual Studio Code e usá-la para monitorar o ponto de extremidade interno.

  5. Envie mensagens do dispositivo para a nuvem para serem encaminhadas para o armazenamento.

    O --properties parâmetro nos permite adicionar propriedades de mensagem, aplicativo ou sistema à mensagem padrão. Para este início rápido, a rota em seu hub IoT está procurando mensagens que contenham a propriedade level=storagemessage .

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

Rever mensagens encaminhadas

  1. Entre no portal do Azure e selecione o grupo de recursos e, em seguida, selecione a conta de armazenamento.

  2. Analise detalhadamente a conta de armazenamento até encontrar os arquivos.

    Look at the storage account files

  3. Selecione um dos arquivos e selecione Baixar e baixar o arquivo para um local que você pode encontrar mais tarde. Tem um nome numérico, como 47. Adicione .txt ao final e, em seguida, clique duas vezes no arquivo para abri-lo.

  4. Quando você abre o arquivo, cada linha é para uma mensagem diferente. O corpo de cada mensagem também é criptografado. Ele deve ser para que você execute consultas no corpo da mensagem.

    View the sent messages

    Nota

    Essas mensagens são codificadas em UTF-8 e base64. Se você ler a mensagem de volta, você tem que decodificá-lo a partir de base64 e utf-8, a fim de lê-lo como ASCII. Se você estiver interessado, você pode usar o método ReadOneRowFromFile no Tutorial de Roteamento para ler um para de um desses arquivos de mensagem e decodificá-lo em ASCII. ReadOneRowFromFile está no repositório IoT C# SDK que você descompactou para este início rápido. Aqui está o caminho da parte superior dessa pasta: ./iothub/device/samples/how to guides/HubRoutingSample/Program.cs Defina o booleano readTheFile como true e codifice o caminho para o arquivo no disco e ele abrirá e traduzirá a primeira linha do arquivo.

Neste início rápido, você implantou um arquivo Bicep para criar um hub IoT e uma conta de armazenamento e, em seguida, executar um programa para enviar mensagens para o hub. As mensagens são roteadas com base em suas propriedades de mensagem e armazenadas na conta de armazenamento onde podem ser visualizadas.

Clean up resources (Limpar recursos)

Quando não precisar mais dos recursos criados, exclua o grupo de recursos.

az group delete --name exampleRG

Próximos passos