你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:使用命名空间主题将 MQTT 消息路由到 Azure 事件中心(Azure CLI)

本教程介绍如何使用命名空间主题将数据从 MQTT 客户端路由到 Azure 事件中心。 下面是概要步骤:

先决条件

启动 Cloud Shell

  1. 登录到 Azure 门户

  2. 选择链接以启动 Cloud Shell。

  3. 切换到 Bash。

    显示 Azure 门户的屏幕截图,其中已打开 Cloud Shell,并选择了 Bash。

创建事件网格命名空间和主题

若要在命名空间中创建事件网格命名空间和主题,请将以下脚本复制到编辑器,将占位符替换为实际值,然后运行命令。

Placeholder 注释
RESOURCEGROUPNAME 指定要创建的资源组的名称。
EVENTGRIDNAMESPACENAME 指定事件网格命名空间的名称。
REGION 指定要在其中创建资源的位置。
NAMESPACETOPICNAME 指定命名空间主题的名称。
rgName="RESOURCEGROUPNAME"
nsName="EVENTGRIDNAMESPACENAME"
location="REGION"
nsTopicName="NAMESPACETOPICNAME"

az group create -n $rgName -l $location
az eventgrid namespace create -g $rgName -n $nsName -l $location --topic-spaces-configuration "{state:Enabled}" --identity "{type:SystemAssigned}"
az eventgrid namespace topic create -g $rgName --name $nsTopicName --namespace-name $nsName

创建事件中心命名空间和事件中心

若要在命名空间中创建事件中心命名空间和事件中心,请将占位符替换为实际值,并运行以下命令。 此事件中心用作本教程中创建的事件订阅中的事件处理程序。

Placeholder 注释
EVENTHUBSNAMESPACENAME 指定要创建的事件中心命名空间的名称。
EVENTHUBNAME 指定要在事件中心命名空间中创建的事件中心实例(事件中心)的名称。
ehubNsName="EVENTHUBSNAMESPACENAME`"
ehubName="EVENTHUBNAME"

az eventhubs namespace create --resource-group $rgName --name $ehubNsName
az eventhubs eventhub create --resource-group $rgName --namespace-name $ehubNsName --name $ehubName

为事件网格命名空间提供将事件发送到事件中心的访问权限

运行以下命令,将事件网格命名空间的服务主体添加到事件中心命名空间上的 Azure 事件中心数据发送者角色。 它允许事件网格命名空间及其资源将事件发送到事件中心命名空间中的事件中心。

egNamespaceServicePrincipalObjectID=$(az ad sp list --display-name $nsName --query [].id -o tsv)
namespaceresourceid=$(az eventhubs namespace show -n $ehubNsName -g $rgName --query "{I:id}" -o tsv) 

az role assignment create --assignee $egNamespaceServicePrincipalObjectID --role "Azure Event Hubs Data Sender" --scope $namespaceresourceid

使用事件中心作为终结点创建事件订阅

若要为之前创建的命名空间主题创建事件订阅,请将占位符替换为实际值,并运行以下命令。 此订阅配置为使用事件中心作为事件处理程序。

Placeholder 注释
EVENTSUBSCRIPTIONNAME 为命名空间主题的事件订阅指定一个名称。
eventSubscriptionName="EVENTSUBSCRIPTIONNAME"
eventhubresourceid=$(az eventhubs eventhub show -n $ehubName --namespace-name $ehubNsName -g $rgName --query "{I:id}" -o tsv) 

az resource create --api-version 2023-06-01-preview --resource-group $rgName --namespace Microsoft.EventGrid --resource-type eventsubscriptions --name $eventSubscriptionName --parent namespaces/$nsName/topics/$nsTopicName --location $location --properties "{\"deliveryConfiguration\":{\"deliveryMode\":\"Push\",\"push\":{\"maxDeliveryCount\":10,\"deliveryWithResourceIdentity\":{\"identity\":{\"type\":\"SystemAssigned\"},\"destination\":{\"endpointType\":\"EventHub\",\"properties\":{\"resourceId\":\"$eventhubresourceid\"}}}}}}"

在事件网格命名空间中配置路由

运行以下命令,在命名空间上启用路由,以将消息或事件路由到之前创建的命名空间主题。 该命名空间主题上的事件订阅将这些事件转发到配置为事件处理程序的事件中心。

routeTopicResourceId=$(az eventgrid namespace topic show -g $rgName --namespace-name $nsName -n $nsTopicName --query "{I:id}" -o tsv) 
az eventgrid namespace create -g $rgName -n $nsName --topic-spaces-configuration "{state:Enabled,'routeTopicResourceId':$routeTopicResourceId}"

客户端、主题空间和权限映射

现在,创建一个客户端来发送一些用于测试的消息。 在此步骤中,你将创建一个客户端、一个包含主题的主题空间,以及发布者和订阅者绑定。

有关详细说明,请参阅 快速入门:使用 Azure CLI 在事件网格命名空间上发布和订阅 MQTT 消息

Placeholder 注释
CLIENTNAME 为发送一些测试消息的客户端指定名称。
CERTIFICATETHUMBPRINT 客户端证书的指纹。 有关创建证书并提取指纹的说明,请参阅上述快速入门。 在 MQTTX 工具中使用同一指纹发送测试消息。
TOPICSPACENAME 指定要创建的主题空间的名称。
PUBLSHERBINDINGNAME 请为发布者绑定指定一个名称。
SUBSCRIBERBINDINGNAME 指定订阅者绑定的名称。
clientName="CLIENTNAME"
clientAuthName="client1-authnID" 
clientThumbprint="CERTIFICATETHUMBPRINT"

topicSpaceName="TOPICSPACENAME"
publisherBindingName="PUBLSHERBINDINGNAME"
subscriberBindingName="SUBSCRIBERBINDINGNAME"

az eventgrid namespace client create -g $rgName --namespace-name $nsName -n $clientName --authentication-name $clientAuthName --client-certificate-authentication "{validationScheme:ThumbprintMatch,allowed-thumbprints:[$clientThumbprint]}"

az eventgrid namespace topic-space create -g $rgName --namespace-name $nsName -n $topicSpaceName --topic-templates ['contosotopics/topic1']

az eventgrid namespace permission-binding create -g $rgName --namespace-name $nsName -n $publisherBindingName --client-group-name '$all' --permission publisher --topic-space-name $topicSpaceName

az eventgrid namespace permission-binding create -g $rgName --namespace-name $nsName -n $subscriberBindingName --client-group-name '$all' --permission subscriber --topic-space-name $topicSpaceName

使用 MQTTX 发送消息

使用 MQTTX 发送一些测试消息。 有关分步说明,请参阅快速入门: 发布和订阅 MQTT 主题

验证事件中心是否在事件中心命名空间的 “概述 ”页上收到这些消息。

屏幕截图显示事件中心的“概述”页,其中包含传入消息计数。

使用流分析查询在事件中心查看路由的 MQTT 消息

在 Azure 门户中,导航到事件订阅中的事件中心实例(事件中心)。 使用流分析处理来自事件中心的数据。 有关详细信息,请参阅 使用流分析处理来自 Azure 事件中心的数据 - Azure 事件中心 |Microsoft Learn。 可以在查询中看到 MQTT 消息。

屏幕截图显示使用流分析查询工具查看事件中心内的 MQTT 消息数据。

后续步骤

有关代码示例,请转到 此 GitHub 存储库