Quickstart: MQTT-berichten publiceren en abonneren op een Event Grid-naamruimte met de Azure CLI
De Azure Event Grid MQTT-brokerfunctie ondersteunt berichten met behulp van het MQTT-protocol. Clients (zowel apparaten als cloudtoepassingen) kunnen MQTT-berichten publiceren en abonneren op flexibele hiërarchische onderwerpen voor scenario's zoals grootschalige uitzending en opdracht en beheer.
In dit artikel gebruikt u de Azure CLI voor het volgende:
- Maak een Event Grid-naamruimte en schakel de MQTT-broker in.
- Maak subresources, zoals clients, clientgroepen en onderwerpruimten.
- Clients toegang verlenen tot publiceren en abonneren op onderwerpruimten.
- MQTT-berichten publiceren en ontvangen.
Als u geen Azure-abonnement hebt, kunt u een gratis Azure-account maken voordat u begint.
Vereisten
- Als u nog niet eerder met Event Grid werkt, leest u het Event Grid-overzicht voordat u aan deze zelfstudie begint.
- Registreer de Event Grid-resourceprovider volgens de stappen in De Event Grid-resourceprovider registreren.
- Zorg ervoor dat de poort 8883 is geopend in uw firewall. Het voorbeeld in deze zelfstudie maakt gebruik van het MQTT-protocol, dat communiceert via poort 8883. Deze poort kan worden geblokkeerd in sommige bedrijfs- en onderwijsnetwerkomgevingen.
- Gebruik de Bash-omgeving in Azure Cloud Shell. Zie quickstart voor Bash in Azure Cloud Shell voor meer informatie.
- Installeer de Azure CLI, indien gewenst, om CLI-referentieopdrachten uit te voeren. Als u windows of macOS gebruikt, kunt u overwegen om de Azure CLI uit te voeren in een Docker-container. Zie De Azure CLI uitvoeren in een Docker-container voor meer informatie.
- Als u een lokale installatie gebruikt, meldt u zich aan bij de Azure CLI met behulp van de
az login
opdracht. Volg de stappen die worden weergegeven in uw terminal om het verificatieproces te voltooien. Raadpleeg Aanmelden bij Azure CLI voor aanvullende aanmeldingsopties. - Installeer de Azure CLI-extensie bij het eerste gebruik, wanneer u hierom wordt gevraagd. Raadpleeg Extensies gebruiken met Azure CLI voor meer informatie over extensies.
- Voer az version uit om de geïnstalleerde versie en afhankelijke bibliotheken te vinden. Voer az upgrade uit om te upgraden naar de nieuwste versie.
- Voor dit artikel is versie 2.53.1 of hoger van de Azure CLI vereist. Als u Azure Cloud Shell gebruikt, is de nieuwste versie al geïnstalleerd.
- U hebt een X.509-clientcertificaat nodig om de vingerafdruk te genereren en de clientverbinding te verifiëren.
- Raadpleeg de CLI-documentatie voor de Event Grid-naamruimte.
Een voorbeeldclientcertificaat en vingerafdruk genereren
Als u nog geen certificaat hebt, kunt u een voorbeeldcertificaat maken met behulp van de stap CLI. Overweeg handmatig te installeren voor Windows.
Open na een geslaagde installatie met behulp van de stap CLI een opdrachtprompt in uw gebruikersprofielmap (Win+R type %USERPROFILE%).
Voer de volgende opdracht uit om basis- en tussencertificaten te maken. Onthoud het wachtwoord dat u in de volgende stap moet gebruiken.
step ca init --deployment-type standalone --name MqttAppSamplesCA --dns localhost --address 127.0.0.1:443 --provisioner MqttAppSamplesCAProvisioner
Gebruik de CA-bestanden (certificate authority) die zijn gegenereerd om een certificaat voor de client te maken. Zorg ervoor dat u het juiste pad gebruikt voor de certificaat- en geheimenbestanden in de opdracht.
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
Voer de stapopdracht uit om de vingerafdruk weer te geven.
step certificate fingerprint client1-authnID.pem
Een naamruimte maken
Gebruik de opdracht om een naamruimte te maken. Werk de opdracht bij met uw resourcegroep en een naamruimtenaam.
az eventgrid namespace create -g {Resource Group} -n {Namespace Name} --topic-spaces-configuration "{state:Enabled}"
Als u de quickstart eenvoudig wilt houden, maakt u een naamruimte met minimale eigenschappen. Zie Naamruimten maken en beheren voor gedetailleerde stappen over het configureren van netwerk, beveiliging en andere instellingen op andere pagina's van de wizard.
Clients maken
Gebruik de opdracht om de client te maken. Werk de opdracht bij met uw resourcegroep en een naamruimtenaam.
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]}"
- Als u de quickstart eenvoudig wilt houden, gebruikt u een vingerafdrukovereenkomst voor verificatie. Zie Clientverificatie met behulp van de certificaatketen X.509 voor clientverificatie voor stappen voor het gebruik van de X.509-CA-certificaatketen.
- Voor deze oefening gebruiken we de standaardgroep
$all client
, die alle clients in de naamruimte bevat. Zie Clientgroepen voor meer informatie over het maken van aangepaste clientgroepen met behulp van clientkenmerken.
Onderwerpruimten maken
Gebruik de opdracht om de onderwerpruimte te maken. Werk de opdracht bij met de resourcegroep, naamruimtenaam en naam van de onderwerpruimte.
az eventgrid namespace topic-space create -g {Resource Group} --namespace-name {Namespace Name} -n {Topicspace Name} --topic-templates ['contosotopics/topic1']
Machtigingsbindingen maken
Gebruik de az eventgrid
opdracht om de eerste machtigingsbinding voor de uitgevermachtiging te maken. Werk de opdracht bij met de resourcegroep, naamruimtenaam en naam van de machtigingsbinding.
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}
Gebruik de opdracht om de tweede machtigingsbinding te maken. Werk de opdracht bij met de resourcegroep, naamruimtenaam en naam van de machtigingsbinding. Deze machtigingsbinding is bedoeld voor abonnees.
az eventgrid namespace permission-binding create -g {Resource Group} --namespace-name {Namespace Name} -n {Name of second Permission Binding} --client-group-name '$all' --permission subscriber --topic-space-name {Topicspace Name}
MQTT-berichten publiceren en abonneren
De volgende voorbeeldcode is een eenvoudige .NET-uitgever die probeert verbinding te maken en te publiceren naar een naamruimte en zich abonneert op het MQTT-onderwerp. U kunt de code gebruiken om te wijzigen op basis van uw behoeften en de code uit te voeren in Visual Studio of een van uw favoriete hulpprogramma's.
U moet het MQTTnet-pakket (versie 4.1.4.563) van NuGet installeren om deze code uit te voeren. (Klik in Visual Studio met de rechtermuisknop op de projectnaam in Solution Explorer, ga naar NuGet-pakketten beheren en zoeken naar MQTTnet. Selecteer het MQTTnet-pakket en installeer.)
Notitie
De volgende voorbeeldcode is alleen bedoeld voor demonstratiedoeleinden en is niet bedoeld voor productiegebruik.
C#-voorbeeldcode voor het verbinden van een client, publiceren en abonneren op een MQTT-bericht in een onderwerp
Belangrijk
Werk het clientcertificaat en de pem-bestandspaden van de sleutel bij, afhankelijk van de locatie van uw clientcertificaatbestanden. Zorg er ook voor dat de naam en onderwerpinformatie van de clientverificatie overeenkomen met uw configuratie.
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);
}
U kunt dezelfde code repliceren en wijzigen voor meerdere clients om de clients te publiceren en te abonneren.