Share via


快速入門:使用 Azure CLI 在事件方格命名空間上發佈和訂閱 MQTT 訊息

Azure 事件方格 MQTT 訊息代理程式功能支援使用 MQTT 通訊協定傳訊。 用戶端(裝置和雲端應用程式)可以透過彈性階層式主題發佈和訂閱 MQTT 訊息,以用於大規模廣播和命令和控制等案例。

在本文中,您會使用 Azure CLI 來:

  • 建立事件方格命名空間,並啟用 MQTT 訊息代理程式。
  • 建立子資源,例如用戶端、用戶端群組和主題空間。
  • 授與用戶端發佈和訂閱主題空間的存取權。
  • 發佈和接收 MQTT 訊息。

如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶

必要條件

  • 如果您不熟悉事件方格,請先閱讀 事件方格概觀 ,再開始本教學課程。
  • 根據註冊事件方格資源提供者中的 步驟,註冊事件方格資源提供者
  • 請確定您的防火牆中已開啟埠 8883。 本教學課程中的範例會使用透過埠 8883 通訊的 MQTT 通訊協定。 在某些公司和教育網路環境中,此埠可能會遭到封鎖。
  • Azure Cloud Shell 中使用 Bash 環境。 如需詳細資訊,請參閱 Azure Cloud Shell 中的 Bash 快速入門
  • 若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 如果您正在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱 在 Docker 容器中執行 Azure CLI。
  • 如果您使用本機安裝,請使用 az login 命令登入 Azure CLI。 若要完成驗證程式,請遵循終端機中顯示的步驟。 如需其他登入選項,請參閱使用 Azure CLI 登入
  • 出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能詳細資訊,請參閱使用 Azure CLI 擴充功能
  • 執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade
  • 本文需要 Azure CLI 2.53.1 版或更新版本。 若您使用的是 Azure Cloud Shell,即已安裝最新版本。
  • 您需要 X.509 用戶端憑證,才能產生指紋並驗證用戶端連線。
  • 檢閱事件方格命名空間 CLI 檔

產生範例客戶端憑證和指紋

如果您還沒有憑證,您可以使用步驟 CLI 來建立範例憑證。 請考慮手動安裝 Windows。

使用步驟 CLI 成功安裝之後,請在使用者配置檔資料夾中開啟命令提示字元(Win+R 類型 %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 -g {Resource Group} -n {Namespace Name} --topic-spaces-configuration "{state:Enabled}"

若要讓快速入門保持簡單,您可以建立具有最少屬性的命名空間。 如需在精靈其他頁面上設定網路、安全性和其他設定的詳細步驟,請參閱 建立和管理命名空間

建立用戶端

使用 命令來建立用戶端。 使用您的資源群組和命名空間名稱更新命令。

az eventgrid namespace client create -g {Resource Group} --namespace-name {Namespace Name} -n {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 -g {Resource Group} --namespace-name {Namespace Name} -n {Topicspace Name} --topic-templates ['contosotopics/topic1']

建立許可權系結

az eventgrid使用 命令建立發行者許可權的第一個許可權系結。 使用您的資源群組、命名空間名稱和許可權系結名稱來更新命令。

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

使用 命令來建立第二個許可權系結。 使用您的資源群組、命名空間名稱和許可權系結名稱來更新命令。 這個許可權系結適用於訂閱者。

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

發佈和訂閱 MQTT 訊息

下列範例程式代碼是一個簡單的 .NET 發行者,會嘗試連線併發佈至命名空間並訂閱 MQTT 主題。 您可以使用程式代碼來根據您的需求修改,並在 Visual Studio 或任何您最愛的工具中執行程式代碼。

您需要從 NuGet 安裝 MQTTnet 套件 (4.1.4.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);
}

您可以復寫和修改多個用戶端的相同程式代碼,以在客戶端之間發佈和訂閱。

下一步