共用方式為


快速入門:使用 Bicep 部署 Azure IoT 中樞和儲存體帳戶

在本快速入門中,您會使用 Bicep 來建立 IoT 中樞、Azure 儲存體帳戶,以及將訊息從 IoT 中樞傳送至儲存體的路由。 設定中樞之後,在符合路由傳送條件時,傳送至中樞的訊息就會自動路由傳送至儲存體帳戶。 在本快速入門結束時,您可以開啟儲存體帳戶並查看已傳送的訊息。

Bicep 是使用宣告式語法來部署 Azure 資源的特定領域語言 (DSL)。 其提供簡潔的語法、可靠的類型安全,並支援程式碼重複使用。 Bicep 能夠為您在 Azure 中的基礎結構即程式碼解決方案,提供最佳的製作體驗。

必要條件

檢閱 Bicep 檔案

本快速入門中使用的 Bicep 檔案稱為來自 Azure 快速入門範本101-iothub-auto-route-messages

Bicep 檔案中定義了兩個 Azure 資源:

@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. 從 Azure 快速入門範本存放庫下載 main.bicep 檔案。

  2. 透過使用 Azure CLI 部署 Bicep 檔案來建立資源。

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

    部署需要數分鐘才能完成。 當部署完成時,您應該會看到詳細說明已部署資源的輸出。

傳送裝置到雲端的訊息

在本節中,您會在新的 IoT 中樞註冊裝置,然後將訊息從該裝置傳送至 IoT 中樞。 Bicep 檔案在 IoT 中樞中設定的路由只會在包含訊息屬性 level=storage 時將訊息傳送至儲存體。 為了測試此路由條件如預期般運作,我們會傳送一些具有該屬性和沒有該屬性的訊息。

提示

為方便起見,本快速入門會使用 Azure CLI 模擬裝置。 如需針對路由傳送使用訊息屬性傳送裝置到雲端訊息的程式碼範例,請參閱適用於 .NET 的 Azure IoT SDK 中的 HubRoutingSample (英文)。

  1. 擷取範本為您建立的 IoT 中樞名稱。

    如果您在上一節中使用預設命令,您的資源是在 ContosoResourceGrp 資源群組中建立的。 如果您使用不同的資源群組,請更新下列命令,使其符合。

    az iot hub list --resource-group ContosoResourceGrp --output table
    
  2. 從輸出複製 IoT 中樞的名稱。 其格式應該像這樣: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 不會在傳送訊息時列印訊息。 如果您想要在訊息到達中樞時觀看訊息,則可以安裝適用於 Visual Studio Code 的 Azure IoT 中樞延伸模組 (部分機器翻譯),並用它來監視內建端點。

  5. 傳送要路由傳送至儲存體之裝置到雲端的訊息。

    --properties 參數可讓我們將訊息、應用程式或系統屬性新增至預設訊息。 在本快速入門中,IoT 中樞的路由會尋找包含訊息屬性 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. 向下切入至儲存體帳戶,直到您找到檔案為止。

    查看記憶體帳戶檔案

  3. 選取其中一個檔案,然後選取 [下載],並將檔案下載到您稍後可以找到的位置。 其名稱為數值,例如 47。 在結尾加上 .txt,然後在檔案上按兩下來開啟檔案。

  4. 當您開啟檔案時,每個資料列都是讓不同的訊息使用。 每個訊息的本文也會加密。 其必須按照順序,才能讓您對訊息本文執行查詢。

    檢視已傳送的訊息

    注意

    這些訊息會以 UTF-8 和 base64 編碼。 如果您回讀訊息,則必須將其從 base64 和 UTF-8 解碼,才能以 ASCII 的形式讀取。 如果您有興趣,可以使用路由教學課程中的 ReadOneRowFromFile 方法,從這些訊息檔案中讀取其中一個檔案,並將其解碼成 ASCII。 ReadOneRowFromFile 位於您針對此快速入門進行解壓縮的 IoT C# SDK 存放庫中。 以下是該資料夾從最上層開始的路徑:./iothub/device/samples/how to guides/HubRoutingSample/Program.cs。將布林值 readTheFile 設定為 true,並將磁碟上檔案的路徑硬式編碼,而其將開啟並轉譯檔案中的第一列。

在本快速入門中,您已部署 Bicep 檔案來建立 IoT 中樞和儲存體帳戶,並執行程式以將訊息傳送至中樞。 訊息會根據其訊息屬性路由傳送,並儲存在可供檢視的儲存體帳戶中。

清除資源

當您不再需要您所建立的資源時,請刪除資源群組。

az group delete --name exampleRG

下一步