Szybki start: wdrażanie centrum Azure IoT i konta magazynu przy użyciu Bicep

W tym przewodniku Szybki start utworzysz 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.

Bicep to język specyficzny dla domeny (DSL), który używa składni deklaratywnej do wdrażania zasobów platformy Azure. Zapewnia zwięzłą składnię, niezawodne bezpieczeństwo typów i obsługę ponownego użycia kodu. Bicep oferuje najlepsze środowisko tworzenia rozwiązań infrastruktury jako kodu na platformie Azure.

Wymagania wstępne

Przejrzyj plik Bicep

Plik Bicep 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 pliku 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

Wdrażanie pliku Bicep

Ta sekcja zawiera kroki wdrażania pliku Bicep.

  1. Pobierz plik main.bicep z repozytorium Szablony szybkiego startu platformy Azure.

  2. Utwórz zasoby, wdrażając plik Bicep przy użyciu interfejsu wiersza polecenia platformy Azure.

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

    Przeprowadzenie wdrożenia zajmuje kilka minut. Po zakończeniu wdrażania powinny zostać wyświetlone dane wyjściowe zawierające szczegóły wdrożonych zasobów.

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 przez plik Bicep w centrum 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 komunikatów kierowanych

  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 plik txt na końcu, a następnie kliknij go dwukrotnie, 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-8 i base64. Jeśli odczytujesz komunikat z powrotem, musisz zdekodować go z base64 i utf-8, 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/how to guides/HubRoutingSample/Program.cs Ustaw wartość logiczną readTheFile na true i zakoduj ścieżkę do pliku na dysku i otworzy i przetłumaczy pierwszy wiersz w pliku.

W tym przewodniku Szybki start wdrożono plik Bicep, aby utworzyć centrum IoT 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

Gdy nie potrzebujesz już utworzonych zasobów, usuń grupę zasobów.

az group delete --name exampleRG

Następne kroki