共用方式為


教學課程:雙向 MQTT 網橋 Azure 事件方格

重要

此頁面包含使用 Kubernetes 部署指令清單來管理 Azure IoT Operations 元件的指示,其處於預覽狀態。 這項功能隨附 數個限制,不應用於生產工作負載。

請參閱 Microsoft Azure 預覽版增補使用規定,以了解適用於 Azure 功能 (搶鮮版 (Beta)、預覽版,或尚未正式發行的版本) 的法律條款。

在本教學課程中,您會在 Azure IoT Operations MQTT 訊息代理程式和 Azure 事件方格 之間設定雙向 MQTT 網橋。 若要讓教學課程保持簡單,請使用 Azure IoT Operations MQTT 訊息代理程式和 Azure 事件方格 端點的預設設定,而且不會套用任何轉換。

必要條件

設定環境變數

使用 Azure CLI 登入:

az login

設定其餘設定的環境變數。 以您選擇的有效值或名稱取代 <> 中的值。 系統會根據您提供的名稱,在您的 Azure 訂用帳戶中建立新的 Azure 事件方格命名空間和主題空間:

# For this tutorial, the steps assume the IoT Operations cluster and the Event Grid
# are in the same subscription, resource group, and location.

# Name of the resource group of Azure Event Grid and IoT Operations cluster 
export RESOURCE_GROUP=<RESOURCE_GROUP_NAME>

# Azure region of Azure Event Grid and IoT Operations cluster
export LOCATION=<LOCATION>

# Name of the Azure Event Grid namespace
export EVENT_GRID_NAMESPACE=<EVENT_GRID_NAMESPACE>

# Name of the Arc-enabled IoT Operations cluster 
export CLUSTER_NAME=<CLUSTER_NAME>

# Subscription ID of Azure Event Grid and IoT Operations cluster
export SUBSCRIPTION_ID=<SUBSCRIPTION_ID>

建立已啟用 MQTT 代理的 Event Grid 命名空間

使用 Azure CLI 建立 Event Grid 命名空間。 位置應該與您用來部署 Azure IoT 操作的位置相同。

az eventgrid namespace create \
  --namespace-name $EVENT_GRID_NAMESPACE \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --topic-spaces-configuration "{state:Enabled,maximumClientSessionsPerAuthenticationName:3}"

eventgrid如果未安裝延伸模組,您會收到詢問是否要安裝該延伸模組的提示。 選取 Y 以安裝擴充功能。

藉由設定 topic-spaces-configuration,此命令會使用下列項目建立命名空間:

  • MQTT 代理 已啟用
  • 每個驗證名稱的用戶端工作階段上限,3

[最大用戶端會話] 選項可讓 Azure IoT Operations MQTT 繁衍多個實例,且仍可連線。 若要深入瞭解,請參閱 多工作階段支援

建立主題空間

在 Event Grid 命名空間中,使用主題範本 telemetry/# 建立名為 tutorial 的主題空間。

az eventgrid namespace topic-space create \
  --resource-group $RESOURCE_GROUP \
  --namespace-name $EVENT_GRID_NAMESPACE \
  --name tutorial \
  --topic-templates "telemetry/#"

藉由在主題範本中使用 # 萬用字元,您可以發佈至 telemetry 主題空間下的任何主題。 例如,telemetry/temperaturetelemetry/humidity

為 Azure IoT 作業提供事件方格主題空間的存取權

使用 Azure CLI,尋找 Azure IoT Operations Arc 延伸模組的主體標識碼。 命令會將主體識別碼儲存在變數中,以供日後使用。

export PRINCIPAL_ID=$(az k8s-extension list \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --cluster-type connectedClusters \
  --query "[?extensionType=='microsoft.iotoperations'].identity.principalId | [0]" -o tsv)
echo $PRINCIPAL_ID

記下 identity.principalId 的輸出值,這是具有下列格式的 GUID 值:

d84481ae-9181-xxxx-xxxx-xxxxxxxxxxxx

然後,使用 Azure CLI 將發行者和訂閱者角色指派給 Azure IoT Operations MQTT,以取得您所建立的主題空間。

指派發行者角色:

az role assignment create \
  --assignee $PRINCIPAL_ID \
  --role "EventGrid TopicSpaces Publisher" \
  --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.EventGrid/namespaces/$EVENT_GRID_NAMESPACE/topicSpaces/tutorial

指派訂閱者角色:

az role assignment create \
  --assignee $PRINCIPAL_ID \
  --role "EventGrid TopicSpaces Subscriber" \
  --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.EventGrid/namespaces/$EVENT_GRID_NAMESPACE/topicSpaces/tutorial

提示

範圍符合您在上一個步驟中使用 az eventgrid namespace topic-space create 所建立主題空間的 id,您可以在命令的輸出中找到它。

Event Grid MQTT 訊息代理程式主機名稱

使用 Azure CLI 取得 Event Grid MQTT 代理主機名稱。

az eventgrid namespace show \
  --resource-group $RESOURCE_GROUP \
  --namespace-name $EVENT_GRID_NAMESPACE \
  --query topicSpacesConfiguration.hostname \
  -o tsv

記下 topicSpacesConfiguration.hostname 的輸出值,其為主機名稱值,看起來像這樣如:

example.region-1.ts.eventgrid.azure.net

建立 Azure 事件方格 數據流端點

建立 Azure 事件方格 的數據流端點。 此端點是數據流的目的地,可將訊息傳送至 Azure 事件方格。 將 取代 <EVENT_GRID_HOSTNAME> 為您從上一個步驟取得的 MQTT 主機名。 包含連接埠號碼 8883

數據流和數據流端點 Azure 事件方格 可以部署為標準 Azure 資源,因為它們有 Azure 資源提供者 (RPs) 實作。 此 Bicep 範本檔案來自 適用於 MQTT 網橋數據流的 Bicep 檔案教學 課程會部署必要的數據流和數據流端點。

將檔案下載到您的本機,並確定將、 aioInstanceNameeventGridHostName 的值customLocationName取代為您的 。

param customLocationName string = '<CUSTOM_LOCATION_NAME>'
param aioInstanceName string = '<AIO_INSTANCE_NAME>'
param eventGridHostName string = '<EVENT_GRID_HOSTNAME>:8883'

resource customLocation 'Microsoft.ExtendedLocation/customLocations@2021-08-31-preview' existing = {
  name: customLocationName
}

resource aioInstance 'Microsoft.IoTOperations/instances@2024-11-01' existing = {
  name: aioInstanceName
}
resource remoteMqttBrokerDataflowEndpoint 'Microsoft.IoTOperations/instances/dataflowEndpoints@2024-11-01' = {
  parent: aioInstance
  name: 'eventgrid'
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    endpointType: 'Mqtt'
    mqttSettings: {
      host: eventGridHostName
      authentication: {
        method: 'SystemAssignedManagedIdentity'
        systemAssignedManagedIdentitySettings: {}
      }
      tls: {
        mode: 'Enabled'
      }
    }
  }
}

接下來,在您的終端機中執行下列命令。 將取代 <FILE> 為您下載的 Bicep 檔名。

az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep

在這裡,驗證方法會設定 SystemAssignedManagedIdentity 為 ,以使用 Azure IoT 作業延伸模組的受控識別向事件方格 MQTT 訊息代理程式進行驗證。 此設定可運作,因為 Azure IoT Operations 擴充功能具有發佈和訂閱透過 Azure RBAC 角色設定的事件方格主題空間所需的許可權。 請注意,組態中不需要任何秘密,例如使用者名稱或密碼。

由於事件方格 MQTT 訊息代理程式需要 TLS, tls 因此會啟用設定。 不需要提供受信任的 CA 憑證,因為事件方格 MQTT 訊息代理程式會使用廣受信任的證書頒發機構單位。

建立資料流程

使用 Azure IoT Operations MQTT 訊息代理程式端點作為來源和 Azure 事件方格 端點作為目的地建立兩個數據流,反之亦然。 不需要設定轉換。

param customLocationName string = '<CUSTOM_LOCATION_NAME>'
param aioInstanceName string = '<AIO_INSTANCE_NAME>'

resource customLocation 'Microsoft.ExtendedLocation/customLocations@2021-08-31-preview' existing = {
  name: customLocationName
}
resource aioInstance 'Microsoft.IoTOperations/instances@2024-11-01' existing = {
  name: aioInstanceName
}
resource defaultDataflowProfile 'Microsoft.IoTOperations/instances/dataflowProfiles@2024-11-01' existing = {
  parent: aioInstance
  name: 'default'
}
resource dataflow_1 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-11-01' = {
  parent: defaultDataflowProfile
  name: 'local-to-remote'
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    mode: 'Enabled'
    operations: [
      {
        operationType: 'Source'
        sourceSettings: {
          endpointRef: 'default'
          dataSources: array('tutorial/local')
        }
      }
      {
        operationType: 'Destination'
        destinationSettings: {
          endpointRef: remoteMqttBrokerDataflowEndpoint.name
          dataDestination: 'telemetry/aio'
        }
      }
    ]
  }
} 
resource dataflow_2 'Microsoft.IoTOperations/instances/dataflowProfiles/dataflows@2024-11-01' = {
  parent: defaultDataflowProfile
  name: 'remote-to-local'
  extendedLocation: {
    name: customLocation.id
    type: 'CustomLocation'
  }
  properties: {
    mode: 'Enabled'
    operations: [
      {
        operationType: 'Source'
        sourceSettings: {
          endpointRef: remoteMqttBrokerDataflowEndpoint.name
          dataSources: array('telemetry/#')
        }
      }
      {
        operationType: 'Destination'
        destinationSettings: {
          endpointRef: 'default'
          dataDestination: 'tutorial/cloud'
        }
      }
    ]
  }
} 

如同資料流端點,請在終端機中執行下列命令:

az deployment group create --resource-group <RESOURCE_GROUP> --template-file <FILE>.bicep

這兩個數據流會形成 MQTT 網橋,您可以在其中:

  • 使用 Event Grid MQTT 訊息代理程式作為遠端訊息代理程式
  • 使用本機 Azure IoT Operations MQTT 訊息代理程式作為本機訊息代理程式
  • 針對遠端和本機訊息代理程式使用 TLS
  • 使用系統指派的受控識別向遠端訊息代理程式進行驗證
  • 使用 Kubernetes 服務帳戶向本機訊息代理程式進行驗證
  • 使用主題對應,將 tutorial/local 主題對應至遠端代理程式上的 telemetry/aio 主題
  • 使用主題對應,將遠端訊息代理程式上的 telemetry/# 主題對應至本機訊息代理程式上的 tutorial/cloud 主題

注意

根據預設,Azure IoT 作業會部署 MQTT 訊息代理程式,以及 MQTT 訊息代理程式數據流端點。 MQTT 訊息代理程式數據流端點可用來連線到 MQTT 訊息代理程式。 默認組態會使用內建服務帳戶令牌進行驗證。 端點命名為 default ,且可在與 Azure IoT 作業相同的命名空間中使用。 端點會作為本教學課程中建立之數據流的來源。 若要深入了解預設 MQTT 訊息代理程式數據流端點,請參閱 Azure IoT 作業本機 MQTT 訊息代理程式預設端點

當您發佈至 tutorial/local 本機 Azure IoT Operations MQTT 訊息代理程式的主題時,訊息會橋接至 telemetry/aio 遠端事件方格 MQTT 訊息代理程式上的主題。 然後,訊息會橋接回 tutorial/cloud 主題(因為 telemetry/# 通配符主題會擷取該主題)在本機 Azure IoT Operations MQTT 訊息代理程式上。 同樣地,當您發佈至 telemetry/aio 遠端事件方格 MQTT 訊息代理程式上的主題時,訊息會橋接至 tutorial/cloud 本機 Azure IoT Operations MQTT 訊息代理程式上的主題。

部署 MQTT 用戶端

若要確認 MQTT 網橋正常運作,請將 MQTT 用戶端部署至與 Azure IoT 作業相同的命名空間。 在名為 client.yaml 的新檔案中,指定用戶端部署:

目前,bicep 不適用於部署 MQTT 用戶端。

啟動訂閱者

使用 kubectl exec 在 mosquitto 用戶端 Pod 中啟動殼層。

kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh

在殼層內,使用 mosquitto_sub啟動主題空間上的 tutorial/# Azure IoT Operations Broker 訂閱者。

mosquitto_sub --host aio-broker --port 18883 \
  -t "tutorial/#" \
  --debug --cafile /var/run/certs/ca.crt \
  -D CONNECT authentication-method 'K8S-SAT' \
  -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

讓命令保持執行狀態,然後開啟新的終端機視窗。

透過橋接器將 MQTT 訊息發佈至雲端

在新的終端機視窗中,在 mosquitto 用戶端 Pod 中啟動另一個殼層。

kubectl exec --stdin --tty mqtt-client -n azure-iot-operations -- sh

在殼層內,使用 mosquitto 將五則訊息發佈至 tutorial/local 主題。

mosquitto_pub -h aio-broker -p 18883 \
  -m "This message goes all the way to the cloud and back!" \
  -t "tutorial/local" \
  --repeat 5 --repeat-delay 1 -d \
  --debug --cafile /var/run/certs/ca.crt \
  -D CONNECT authentication-method 'K8S-SAT' \
  -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

檢視訂閱者中的訊息

在訂閱者殼層中,您會看到您發佈的訊息。

在這裡,您會看到訊息發佈至本機 Azure IoT Operations 訊息代理程式至 tutorial/local 主題、橋接至事件方格 MQTT 訊息代理程式,然後在主題中 tutorial/cloud 再次橋接回本機 Azure IoT Operations 訊息代理程式。 訊息接著會傳遞至訂閱者。 在此範例中,來回時間約為 80 毫秒。

檢查 Event Grid 計量以確認訊息傳遞

您也可以檢查 Event Grid 計量,以確認訊息已傳遞至 Event Grid MQTT 代理。 在 Azure 入口網站 中,移至您所建立的事件方格命名空間。 在 [計量>MQTT:成功發行的訊息]下。 當您將訊息發佈至本機 Azure IoT Operations Broker 時,您應該會看到已發行和傳遞的訊息數目增加。

Azure 入口網站中計量檢視的螢幕擷取畫面,以顯示成功的 MQTT 訊息。

下一步

在本教學課程中,您已瞭解如何使用 Azure 事件方格 MQTT 訊息代理程式設定雙向 MQTT 網橋的 Azure IoT 作業。 後續步驟會探索下列案例:

  • 若要使用 MQTT 用戶端將訊息直接發佈至 Event Grid MQTT 訊息代理程式,請參閱 將 MQTT 訊息發佈至 Event Grid MQTT 訊息代理程式。 為用戶端提供對您所建立主題空間的 發行者權限繫結,而且您可以將訊息發佈至 telemetry 下的任何主題,例如 telemetry/temperaturetelemetry/humidity。 所有這些訊息都會橋接至 tutorial/cloud 本機 Azure IoT Operations 訊息代理程式上的主題。
  • 若要 Event Grid MQTT 代理的路由規則,請參閱 設定 Event Grid MQTT 代理的路由規則。 您可以使用路由規則,根據主題名稱將訊息路由傳送至不同的主題,或根據訊息內容篩選訊息。