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

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

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

先决条件

  • 如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户
  • 如果你不熟悉事件网格,请在开始本教程之前阅读事件网格概述
  • 根据注册事件网格资源提供程序中的步骤注册事件网格资源提供程序。
  • 确保已在防火墙中打开端口 8883。 本教程中的示例使用 MQTT 协议,该协议通过端口 8883 进行通信。 在某些公司和教育网络环境中,此端口可能被阻止。

启动 Cloud Shell

  1. 登录到 Azure 门户

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

  3. 切换到“Bash”。

    屏幕截图显示 Azure 门户,其中的 Cloud Shell 处于打开状态,Bash 处于选中状态。

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

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

占位符 评论
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

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

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

占位符 评论
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

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

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

占位符 评论
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 消息

占位符 评论
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 存储库