Udostępnij przez


Szybki start: publikowanie i subskrybowanie komunikatów MQTT w przestrzeni nazw usługi Event Grid przy użyciu interfejsu wiersza polecenia platformy Azure

W tej szybkiej instrukcji użyjesz funkcji brokera MQTT Azure Event Grid do obsługi wiadomości przy użyciu protokołu MQTT. Klienci, w tym zarówno urządzenia, jak i aplikacje w chmurze, mogą publikować i subskrybować komunikaty MQTT w elastycznych tematach hierarchicznych dla scenariuszy, takich jak emisja na dużą skalę i sterowanie i kontrola.

W tym artykule użyjesz interfejsu wiersza polecenia platformy Azure do:

  • Utwórz przestrzeń nazw usługi Event Grid i włącz brokera MQTT.
  • Utwórz podźródła, takie jak klienci, grupy klientów i przestrzenie tematów.
  • Udziel klientom dostępu do publikowania i subskrybowania obszarów tematycznych.
  • Publikowanie i odbieranie komunikatów MQTT.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto platformy Azure.

Wymagania wstępne

  • Jeśli dopiero zaczynasz korzystać z usługi Event Grid, zapoznaj się z omówieniem usługi Event Grid przed rozpoczęciem tego samouczka.
  • Zarejestruj dostawcę zasobów usługi Event Grid zgodnie z krokami w temacie Rejestrowanie dostawcy zasobów usługi Event Grid.
  • Upewnij się, że port 8883 jest otwarty w twoim firewallu. W tym samouczku używany jest protokół MQTT, który komunikuje się za pośrednictwem portu 8883. Ten port może zostać zablokowany w niektórych środowiskach sieci firmowych i edukacyjnych.
  • Użyj środowiska Bash w Azure Cloud Shell. Aby uzyskać więcej informacji, zobacz Get started with Azure Cloud Shell.
  • Jeśli wolisz uruchamiać polecenia referencyjne interfejsu wiersza polecenia lokalnie, zainstaluj Azure CLI. Jeśli korzystasz z systemu Windows lub macOS, rozważ uruchomienie interfejsu wiersza polecenia platformy Azure w kontenerze platformy Docker. Aby uzyskać więcej informacji, zobacz Uruchamianie interfejsu wiersza polecenia platformy Azure w kontenerze platformy Docker.
  • Jeśli używasz instalacji lokalnej, zaloguj się do interfejsu az login wiersza polecenia platformy Azure przy użyciu polecenia . Aby zakończyć proces uwierzytelniania, wykonaj kroki wyświetlane w terminalu. Aby uzyskać inne opcje logowania, zobacz Uwierzytelnianie na platformie Azure przy użyciu interfejsu wiersza polecenia platformy Azure.
  • Gdy zostaniesz o to poproszony/a, zainstaluj rozszerzenie Azure CLI przy pierwszym użyciu. Aby uzyskać więcej informacji na temat rozszerzeń, zobacz Zarządzanie rozszerzeniami interfejsu wiersza polecenia platformy Azure.
  • Uruchom az version, aby sprawdzić zainstalowaną wersję i biblioteki zależne. Aby zaktualizować do najnowszej wersji, uruchom az upgrade.
  • Ten artykuł wymaga wersji 2.53.1 lub nowszej interfejsu wiersza polecenia platformy Azure. Jeśli używasz usługi Azure Cloud Shell, najnowsza wersja jest już zainstalowana.
  • Potrzebny jest certyfikat klienta X.509 do wygenerowania odcisku palca i uwierzytelnienia połączenia klienta.
  • Przejrzyj polecenia CLI przestrzeni nazw usługi Event Grid.

Generowanie przykładowego certyfikatu klienta i odcisku palca

Jeśli nie masz jeszcze certyfikatu, możesz utworzyć przykładowy certyfikat przy użyciu step CLI. Rozważ ręczne instalowanie dla systemu Windows.

Po pomyślnej instalacji za pomocą step CLI, otwórz wiersz polecenia w folderze profilu użytkownika (Win+R type %USERPROFILE%).

  1. Aby utworzyć certyfikaty główne i pośrednie, uruchom następujące polecenie. Zapamiętaj hasło, które należy użyć w następnym kroku.

    step ca init --deployment-type standalone --name MqttAppSamplesCA --dns localhost --address 127.0.0.1:443 --provisioner MqttAppSamplesCAProvisioner
    
  2. Aby utworzyć certyfikat dla klienta, użyj wygenerowanych plików urzędu certyfikacji. Upewnij się, że w poleceniu użyto poprawnej ścieżki dla plików certyfikatów i tajnych danych.

    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. Aby wyświetlić odcisk palca, uruchom polecenie kroku.

    step certificate fingerprint client1-authnID.pem
    

Tworzenie przestrzeni nazw

Użyj tego polecenia, aby utworzyć przestrzeń nazw. Zaktualizuj polecenie przy użyciu grupy zasobów i nazwy przestrzeni nazw.

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

Aby ten szybki przewodnik był prosty, utwórz przestrzeń nazw z minimalnymi właściwościami. Aby uzyskać więcej informacji na temat sieci, zabezpieczeń i ustawień na innych kartach, zobacz Tworzenie przestrzeni nazw i zarządzanie nimi.

Tworzenie klientów

Użyj tego polecenia, aby utworzyć klienta. Zaktualizuj polecenie przy użyciu grupy zasobów i nazwy przestrzeni nazw.

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]}"
  • Aby zachować prostotę tego szybkiego startu, użyj dopasowania odcisku palca do uwierzytelniania. Aby zapoznać się z instrukcjami dotyczącymi korzystania z łańcucha certyfikatów X.509 urzędu certyfikacji do uwierzytelniania klienta, zobacz Uwierzytelnianie klienta przy użyciu łańcucha certyfikatów.
  • W tym ćwiczeniu użyj grupy domyślnej $all client zawierającej wszystkich klientów w przestrzeni nazw. Aby dowiedzieć się więcej na temat tworzenia niestandardowych grup klientów przy użyciu atrybutów klienta, zobacz Grupy klientów.

Tworzenie obszarów tematów

Użyj tego polecenia, aby utworzyć przestrzeń tematu. Zaktualizuj polecenie przy użyciu grupy zasobów, nazwy przestrzeni nazw i nazwy obszaru tematu.

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

Tworzenie wiązań uprawnień

Użyj polecenia az eventgrid, aby utworzyć pierwsze powiązanie dla uprawnień wydawcy. Zaktualizuj polecenie, podając grupę zasobów, nazwę przestrzeni nazw oraz nazwę powiązania uprawnień.

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}

Użyj tego polecenia, aby utworzyć drugie powiązanie uprawnień. Zaktualizuj polecenie, podając grupę zasobów, nazwę przestrzeni nazw oraz nazwę powiązania uprawnień. To powiązanie uprawnień dotyczy subskrybentów.

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}

Publikowanie i subskrybowanie komunikatów MQTT

Przykładowy kod poniżej to prosty wydawca .NET, który próbuje nawiązać połączenie i publikować w przestrzeni nazw oraz subskrybować temat MQTT. Możesz zmodyfikować kod wymagań i uruchomić go w programie Visual Studio lub innym narzędziu projektowym.

Aby uruchomić ten kod, należy zainstalować pakiet MQTTnet (wersja 4.1.4.563) z pakietu NuGet. W programie Visual Studio kliknij prawym przyciskiem myszy nazwę projektu w Eksploratorze rozwiązań, przejdź do pozycji Zarządzaj pakietami NuGet i wyszukaj ciąg MQTnet. Wybierz pakiet MQTTnet i zainstaluj.

Uwaga / Notatka

Poniższy przykładowy kod jest przeznaczony tylko do celów demonstracyjnych i nie jest przeznaczony do użytku produkcyjnego.

Przykładowy kod języka C# umożliwiający łączenie klienta, publikowanie i subskrybowanie komunikatu MQTT w temacie

Ważne

Zaktualizuj ścieżki pliku pem i certyfikatu klienta w zależności od lokalizacji plików certyfikatów klienta. Upewnij się również, że nazwa uwierzytelniania klienta i informacje o temacie są zgodne z konfiguracją.

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);
}

Można zduplikować i zmodyfikować ten sam kod dla wielu klientów, aby umożliwić im udostępnianie i abonowanie w systemie.

Aby uzyskać przykłady kodu, przejdź do tego repozytorium GitHub.