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

La fonctionnalité MQTT broker d’Azure Event Grid prend en charge la messagerie à l’aide du protocole MQTT. Les clients (appareils et applications cloud) peuvent publier et s’abonner à des messages MQTT via des rubriques hiérarchiques flexibles dans les scénarios tels que la diffusion à grande échelle, l’envoi de commandes ainsi que le contrôle.

Dans cet article, vous utilisez Azure CLI pour :

  • Créer un espace de noms Event Grid, puis activer MQTT broker.
  • Créer des sous-ressources telles que des clients, des groupes de clients et des espaces de rubrique.
  • Octroyer aux clients l’accès nécessaire pour publier et s’abonner aux espaces de rubrique.
  • Publier et recevoir des messages MQTT.

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

Prérequis

  • Si vous débutez avec Event Grid, lisez attentivement 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.
  • Vérifiez que le port 8883 est ouvert dans votre pare-feu. L’exemple dans ce tutoriel utilise le protocole MQTT, lequel 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 plus d’informations, consultez Démarrage rapide pour Bash dans Azure Cloud Shell.
  • Si vous préférez exécuter les commandes de référence de l’interface de ligne de commande localement, installez l’interface Azure CLI. Si vous utilisez Windows ou macOS, vous pouvez 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 achever le processus d’authentification, suivez les étapes qui s’affichent dans votre terminal. Pour connaître les autres options de connexion, consultez Se connecter avec 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 Utiliser des extensions avec 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 la documentation de l’interface CLI sur l’espace de noms Event Grid.

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

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

Une fois l’installation réussie à l’aide de l’interface CLI de step, ouvrez une invite de commandes dans votre dossier de profil utilisateur (Win+R, tapez %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. Utilisez les fichiers d’autorité de certification générés afin de créer un certificat pour le client. Veillez à utiliser le chemin 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 la 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 -g {Resource Group} -n {Namespace Name} --topic-spaces-configuration "{state:Enabled}"

Pour que le démarrage rapide reste simple, créez un espace de noms avec un nombre minimal de propriétés. Pour connaître les étapes détaillées relatives à la configuration du réseau, de la sécurité et d’autres paramètres dans les autres pages de l’Assistant, consultez Créer et gérer des espaces de noms.

Créer des clients

Utilisez la 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 -g {Resource Group} --namespace-name {Namespace Name} -n {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. Si vous souhaitez connaître les étapes détaillées relatives à l’utilisation de la chaîne de certificats de l’autorité de certification X.509 pour l’authentification du client, consultez Authentification du client à l’aide de la chaîne de certificats.
  • Pour cet exercice, nous utilisons le groupe $all client par défaut, qui comprend tous les clients de l’espace de noms. Pour en savoir plus sur la création de groupes de clients personnalisés à l’aide des attributs de clients, consultez Groupes de clients.

Créer des espaces de rubrique

Utilisez la 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 -g {Resource Group} --namespace-name {Namespace Name} -n {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 -g {Resource Group} --namespace-name {Namespace Name} -n {Permission Binding Name} --client-group-name '$all' --permission publisher --topic-space-name {Topicspace Name}

Utilisez la 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 liaison d’autorisation est destinée aux abonnés.

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}

Publier et s’abonner aux messages MQTT

L’exemple de code suivant est celui d’un simple éditeur .NET qui tente de se connecter et de publier sur un espace de noms, et qui s’abonne à la rubrique MQTT. Vous pouvez modifier le code en fonction de vos besoins, et l’exécuter dans Visual Studio ou l’un de vos outils favoris.

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, puis recherchez MQTTnet. Sélectionnez Package MQTTnet, puis effectuez l’installation.)

Remarque

L’exemple de code suivant est fourni à des fins de démonstration uniquement, et n’est pas destiné à un usage en production.

Exemple de code C# pour connecter un client, publier et s’abonner à un message MQTT d’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 leur permettre d’effectuer des opérations de publication et d’abonnement entre eux.

Étapes suivantes