Partager via


Démarrage rapide : Publier et s’abonner aux messages MQTT sur un espace de noms Event Grid avec Azure CLI

Dans ce guide de démarrage rapide, vous utilisez la fonctionnalité broker Azure Event Grid MQTT pour prendre en charge la messagerie à l’aide du protocole MQTT. Les clients, y compris les appareils et les applications cloud, peuvent publier et s’abonner à des messages MQTT sur des rubriques hiérarchiques flexibles pour des scénarios tels que la diffusion à grande échelle et la commande et le contrôle.

Dans cet article, vous utilisez Azure CLI pour :

  • Créez un espace de noms Event Grid et activez le répartiteur MQTT.
  • Créez des sous-ressources telles que des clients, des groupes de clients et des espaces de rubriques.
  • Accordez aux clients l’accès pour publier et s’abonner aux espaces de rubrique.
  • Publiez et recevez des messages MQTT.

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit Azure avant de commencer.

Conditions préalables

  • Si vous débutez avec Event Grid, consultez la vue d’ensemble d’Event Grid avant de commencer ce tutoriel.
  • Inscrivez le fournisseur de ressources Event Grid en suivant les étapes décrites dans Inscrire le fournisseur de ressources Event Grid.
  • Assurez-vous que le port 8883 est ouvert dans votre pare-feu. Ce tutoriel utilise le protocole MQTT, qui communique sur le port 8883. Ce port pourrait être bloqué dans certains environnements réseau professionnels et scolaires.
  • Utilisez l’environnement Bash dans Azure Cloud Shell. Pour obtenir plus d’informations, consultez Démarrage d’Azure Cloud Shell.
  • Si vous préférez exécuter des commandes de référence CLI localement, installez Azure CLI. Si vous exécutez sur Windows ou macOS, envisagez d’exécuter Azure CLI dans un conteneur Docker. Pour plus d’informations, consultez Exécuter Azure CLI dans un conteneur Docker.
  • Si vous utilisez une installation locale, connectez-vous à Azure CLI à l’aide de la commande az login. Pour terminer le processus d’authentification, suivez les étapes qui s’affichent dans votre terminal. Pour obtenir d’autres options de connexion, consultez S’authentifier auprès d’Azure à l’aide d’Azure CLI.
  • Lorsque vous y êtes invité, installez l’extension Azure CLI lors de la première utilisation. Pour plus d’informations sur les extensions, consultez Gérer les extensions Azure CLI.
  • Exécutez az version pour rechercher la version et les bibliothèques dépendantes installées. Pour effectuer une mise à niveau vers la dernière version, exécutez az upgrade.
  • Cet article nécessite la version 2.53.1 ou ultérieure d’Azure CLI. Si vous utilisez Azure Cloud Shell, sachez que la version la plus récente est déjà installée.
  • Vous avez besoin d’un certificat client X.509 pour générer l’empreinte numérique et authentifier la connexion cliente.
  • Passez en revue les commandes CLI de l’espace de noms Event Grid.

Générer un exemple de certificat client et d’empreinte numérique

Si vous n’avez pas encore de certificat, vous pouvez créer un exemple de certificat à l’aide de l’interface CLI de l’étape. Envisagez d’installer manuellement pour Windows.

Une fois l’installation réussie à l’aide de l’interface CLI, ouvrez une fenêtre d’invite de commandes dans votre dossier de profil utilisateur (Win+R type %USERPROFILE%).

  1. Pour générer des certificats racine et intermédiaires, exécutez la commande suivante. N’oubliez pas le mot de passe que vous devez utiliser à l’étape suivante.

    step ca init --deployment-type standalone --name MqttAppSamplesCA --dns localhost --address 127.0.0.1:443 --provisioner MqttAppSamplesCAProvisioner
    
  2. Pour créer un certificat pour le client, utilisez les fichiers d’autorité de certification générés. Veillez à utiliser le chemin d’accès approprié pour les fichiers de certificat et de secrets dans la commande.

    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. Pour voir l’empreinte, exécutez la commande step.

    step certificate fingerprint client1-authnID.pem
    

Créer un espace de noms

Utilisez cette commande pour créer un espace de noms. Mettez à jour la commande avec votre groupe de ressources et un nom d’espace de noms.

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

Pour simplifier ce démarrage rapide, créez un espace de noms avec des propriétés minimales. Pour plus d’informations sur le réseau, la sécurité et les paramètres sous d’autres onglets, consultez Créer et gérer des espaces de noms.

Créer des clients

Utilisez cette commande pour créer le client. Mettez à jour la commande avec votre groupe de ressources et un nom d’espace de noms.

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]}"
  • Pour que le démarrage rapide reste simple, utilisez la correspondance d’empreinte dans le cadre de l’authentification. Pour savoir comment utiliser la chaîne de certificats d’autorité de certification X.509 pour l’authentification du client, consultez l’authentification du client à l’aide de la chaîne de certificats.
  • Pour cet exercice, utilisez le groupe par défaut $all client , qui inclut tous les clients de l’espace de noms. Pour en savoir plus sur la création de groupes clients personnalisés à l’aide d’attributs clients, consultez Groupes clients.

Créer des espaces de rubrique

Utilisez cette commande pour créer l’espace de rubrique. Mettez à jour la commande avec votre groupe de ressources, le nom d’espace de noms et le nom d’espace de rubrique.

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

Créer des liaisons d’autorisation

Utilisez la commande az eventgrid afin de créer la première liaison d’autorisation pour l’autorisation Éditeur. Mettez à jour la commande avec votre groupe de ressources, le nom d’espace de noms et le nom de liaison d’autorisation.

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}

Utilisez cette commande pour créer la deuxième liaison d’autorisation. Mettez à jour la commande avec votre groupe de ressources, le nom d’espace de noms et le nom de liaison d’autorisation. Cette attribution de permission concerne les abonnés.

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}

Publier et s’abonner aux messages MQTT

L’exemple de code suivant est un éditeur .NET simple qui tente de se connecter et de publier dans un espace de noms et s’abonne à la rubrique MQTT. Vous pouvez modifier le code pour vos besoins et l’exécuter dans Visual Studio ou un autre outil de conception.

Vous devez installer le package MQTTnet (version 4.1.4.563) à partir de NuGet pour exécuter ce code. Dans Visual Studio, cliquez avec le bouton droit sur le nom du projet dans l’Explorateur de solutions, accédez à Gérer les packages NuGet et recherchez MQTTnet. Sélectionnez le package MQTTnet et installez.

Remarque

L’exemple de code suivant est destiné à des fins de démonstration uniquement et n’est pas destiné à une utilisation en production.

Exemple de code C# pour connecter un client, publier et s’abonner à un message MQTT sur une rubrique

Important

Mettez à jour les chemins du certificat client et du fichier pem de clé en fonction de l’emplacement de vos fichiers de certificat client. Vérifiez également que le nom d’authentification du client et les informations de rubrique correspondent à votre configuration.

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

Vous pouvez répliquer et modifier le même code pour plusieurs clients afin de publier et de s’abonner parmi les clients.

Si vous souhaitez obtenir des exemples de code, accédez à ce référentiel GitHub.