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

快速入门:使用 Azure CLI 在事件网格命名空间上发布和订阅 MQTT 消息

在本快速入门中,你将使用 Azure 事件网格 MQTT 中转站功能支持使用 MQTT 协议的消息传送。 客户端(包括设备和云应用程序)可以通过灵活的分层主题发布和订阅 MQTT 消息,这些主题适用于大规模广播和命令和控制等方案。

在本文中,你将使用 Azure CLI:

  • 创建事件网格命名空间并启用 MQTT 代理。
  • 创建客户端、客户端组和主题空间等子资源。
  • 授予客户端发布和订阅主题空间的权限。
  • 发布和接收 MQTT 消息。

如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户

先决条件

  • 如果你不熟悉事件网格,请参阅 事件网格概述 ,然后再开始本教程。
  • 根据注册事件网格资源提供程序中的步骤注册事件网格资源提供程序。
  • 确保已在防火墙中打开端口 8883。 本教程使用通过端口 8883 进行通信的 MQTT 协议。 在某些公司和教育网络环境中,此端口可能被阻止。
  • Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 入门
  • 如需在本地运行 CLI 参考命令,请安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅 在 Docker 容器中运行 Azure CLI
  • 如果使用的是本地安装,请使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅 使用 Azure CLI 向 Azure 进行身份验证
  • 出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 管理 Azure CLI 扩展
  • 运行az version命令,以查看已安装的版本和依赖库。 若要升级到最新版本,请运行az upgrade
  • 本文需要 Azure CLI 2.53.1 或更高版本。 如果你使用的是 Azure Cloud Shell,则表示已安装最新版本。
  • 需要使用一个 X.509 客户端证书生成指纹并对客户端连接进行身份验证。
  • 查看事件网格命名空间 CLI 命令

生成示例客户端证书和指纹

如果还没有证书,可以使用 步骤 CLI 创建示例证书。 考虑手动安装适用于 Windows 的版本。

使用步骤 CLI 成功安装后,在用户配置文件文件夹中打开命令提示符窗口(Win+R type %USERPROFILE%)。

  1. 要创建根证书和中间证书,请运行以下命令。 请记住需要在下一步中使用的密码。

    step ca init --deployment-type standalone --name MqttAppSamplesCA --dns localhost --address 127.0.0.1:443 --provisioner MqttAppSamplesCAProvisioner
    
  2. 若要为客户端创建证书,请使用生成的证书颁发机构 (CA) 文件。 请确保使用命令中证书和机密文件的正确路径。

    step certificate create client1-authnID client1-authnID.pem client1-authnID.key --ca .step/certs/intermediate_ca.crt --ca-key .step/secrets/intermediate_ca_key --no-password --insecure --not-after 2400h
    
  3. 若要查看指纹,请运行步骤命令。

    step certificate fingerprint client1-authnID.pem
    

创建命名空间

使用此命令创建命名空间。 使用你的资源组和命名空间名称更新该命令。

az eventgrid namespace create --resource-group {Resource Group} --name {Namespace Name} --topic-spaces-configuration "{state:Enabled}"

若要使本快速入门保持简单,请创建具有最小属性的命名空间。 有关其他选项卡上的网络、安全性和设置的详细信息,请参阅 “创建和管理命名空间”。

创建客户端

使用此命令创建客户端。 请用您的资源组和命名空间名称更新该命令。

az eventgrid namespace client create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Client Name} --authentication-name client1-authnID --client-certificate-authentication "{validationScheme:ThumbprintMatch,allowed-thumbprints:[Client Thumbprint]}"
  • 若要使本快速入门保持简单,请使用指纹匹配进行身份验证。 有关如何使用 X.509 CA 证书链进行客户端身份验证的步骤,请参阅 使用证书链进行客户端身份验证
  • 在本练习中,请使用默认 $all client 组,其中包括命名空间中的所有客户端。 若要详细了解如何使用客户端属性创建自定义客户端组,请参阅 客户端组

创建主题空间

使用此命令创建主题空间。 用你的资源组、命名空间名称和主题空间名称来更新命令。

az eventgrid namespace topic-space create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Topicspace Name} --topic-templates ['contosotopics/topic1']

创建权限绑定

使用az eventgrid命令来为发布者权限创建第一个权限绑定。 使用资源组、命名空间名称和权限绑定名称更新命令。

az eventgrid namespace permission-binding create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Permission Binding Name} --client-group-name '$all' --permission publisher --topic-space-name {Topicspace Name}

使用此命令创建第二个权限绑定。 使用资源组、命名空间名称和权限绑定名称更新命令。 此权限绑定适用于订阅者。

az eventgrid namespace permission-binding create --resource-group {Resource Group} --namespace-name {Namespace Name} --name {Name of second Permission Binding} --client-group-name '$all' --permission subscriber --topic-space-name {Topicspace Name}

发布和订阅 MQTT 消息

以下示例代码是一个简单的 .NET 发布者,它尝试连接并发布到命名空间并订阅 MQTT 主题。 可以根据要求修改代码,并在 Visual Studio 或其他设计工具中运行它。

需要从 NuGet 安装 MQTTnet 包(版本 4.1.4.563),才能运行此代码。 在 Visual Studio 中,右键单击解决方案资源管理器中的项目名称,转到 “管理 NuGet 包”,然后搜索 MQTTnet。 选择 MQTTnet 包 并安装。

注释

以下示例代码仅用于演示目的,不适用于生产用途。

用于连接客户端、发布和订阅主题上的 MQTT 消息的示例 C# 代码

重要

请根据客户端证书文件的位置更新客户端证书和密钥 pem 文件路径。 此外,请确保客户端身份验证名称和主题信息与配置匹配。

using MQTTnet.Client;
using MQTTnet;
using System.Security.Cryptography.X509Certificates;

string hostname = "{Your Event Grid namespace MQTT hostname}";
string clientId = "client1-session1";  //client ID can be the session identifier.  A client can have multiple sessions using username and clientId.
string x509_pem = @" client certificate cer.pem file path\client.cer.pem";  //Provide your client certificate .cer.pem file path
string x509_key = @"client certificate key.pem file path\client.key.pem";  //Provide your client certificate .key.pem file path

var certificate = new X509Certificate2(X509Certificate2.CreateFromPemFile(x509_pem, x509_key).Export(X509ContentType.Pkcs12));

var mqttClient = new MqttFactory().CreateMqttClient();

var connAck = await mqttClient!.ConnectAsync(new MqttClientOptionsBuilder()
    .WithTcpServer(hostname, 8883)
    .WithClientId(clientId)
    .WithCredentials("client1-authnID", "")  //use client authentication name in the username
    .WithTls(new MqttClientOptionsBuilderTlsParameters()
    {
        UseTls = true,
        Certificates = new X509Certificate2Collection(certificate)
    })

    .Build());

Console.WriteLine($"Client Connected: {mqttClient.IsConnected} with CONNACK: {connAck.ResultCode}");

mqttClient.ApplicationMessageReceivedAsync += async m => await Console.Out.WriteAsync($"Received message on topic: '{m.ApplicationMessage.Topic}' with content: '{m.ApplicationMessage.ConvertPayloadToString()}'\n\n");

var suback = await mqttClient.SubscribeAsync("contosotopics/topic1");
suback.Items.ToList().ForEach(s => Console.WriteLine($"subscribed to '{s.TopicFilter.Topic}' with '{s.ResultCode}'"));

while (true)
{
    var puback = await mqttClient.PublishStringAsync("contosotopics/topic1", "hello world!");
    Console.WriteLine(puback.ReasonString);
    await Task.Delay(1000);
}

可以复制和修改多个客户端的相同代码,以便在客户端之间发布和订阅。

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