Condividi tramite


Guida introduttiva: Pubblicare e abbonarsi a messaggi MQTT nel namespace di Event Grid con Azure CLI

In questa guida introduttiva si usa la funzionalità broker MQTT di Griglia di eventi di Azure per supportare la messaggistica usando il protocollo MQTT. I client, inclusi i dispositivi e le applicazioni cloud, possono pubblicare e sottoscrivere messaggi MQTT su argomenti gerarchici flessibili per scenari come trasmissione e comando e controllo su larga scala.

In questo articolo si usa l'interfaccia della riga di comando di Azure per:

  • Creare uno spazio dei nomi Event Grid e abilitare il broker MQTT.
  • Creare sottorisorse, ad esempio client, gruppi client e spazi di argomenti.
  • Concedere ai clienti l'accesso per pubblicare e sottoscrivere a spazi tematici.
  • Pubblicare e ricevere messaggi MQTT.

Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.

Prerequisiti

Generare un certificato client di esempio e un'impronta digitale

Se non si ha già un certificato, è possibile creare un certificato di esempio usando il step CLI. Prendere in considerazione l'installazione manuale per Windows.

Dopo aver completato l'installazione usando step nell'interfaccia della riga dei comandi, aprire una finestra del prompt dei comandi nella cartella del profilo utente (Win+R type %USERPROFILE%).

  1. Per creare certificati radice e intermedi, usare il comando seguente. Ricordare la password, che è necessario usare nel passaggio successivo.

    step ca init --deployment-type standalone --name MqttAppSamplesCA --dns localhost --address 127.0.0.1:443 --provisioner MqttAppSamplesCAProvisioner
    
  2. Per creare un certificato per il client, usare i file dell'autorità di certificazione (CA) generati. Assicurarsi di usare il percorso corretto per i file di certificati e segreti nel comando .

    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. Per visualizzare l'identificazione personale, eseguire il comando step.

    step certificate fingerprint client1-authnID.pem
    

Creare uno spazio dei nomi

Usare questo comando per creare uno spazio dei nomi. Aggiornare il comando con il gruppo di risorse e un nome di spazio dei nomi.

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

Per semplificare questo avvio rapido, creare uno spazio dei nomi con proprietà minime. Per altre informazioni su rete, sicurezza e impostazioni in altre schede, vedere Creare e gestire spazi dei nomi.

Creare client

Usare questo comando per creare il client. Aggiorna il comando con il tuo gruppo di risorse e il nome del namespace.

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]}"
  • Per semplificare questo avvio rapido, usare la corrispondenza dell'identificazione personale per l'autenticazione. Per informazioni su come usare la catena di certificati della CA X.509 per l'autenticazione client, vedere Autenticazione client tramite catena di certificati.
  • Per questo esercizio, usare il gruppo predefinito $all client , che include tutti i client nello spazio dei nomi . Per altre informazioni sulla creazione di gruppi client personalizzati tramite attributi client, vedere Gruppi di client.

Creare spazi argomento

Usare questo comando per creare lo spazio argomento. Aggiornare il comando con il gruppo di risorse, il nome dello spazio dei nomi e il nome dell'argomento.

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

Creare associazioni autorizzazioni

Usare il comando az eventgrid per creare la prima associazione di autorizzazioni per i permessi del publisher. Aggiornare il comando con il gruppo di risorse, il nome dello spazio dei nomi e il nome dell'associazione di autorizzazioni.

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}

Usare questo comando per creare la seconda associazione di autorizzazioni. Aggiornare il comando con il gruppo di risorse, il nome dello spazio dei nomi e il nome dell'associazione di autorizzazioni. Questa associazione di autorizzazioni è per i sottoscrittori.

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}

Pubblicare ed eseguire la sottoscrizione in messaggi MQTT

Il codice di esempio seguente è un semplice publisher .NET che tenta di connettersi a uno spazio dei nomi, pubblica ed esegue la sottoscrizione nell'argomento MQTT. È possibile modificare il codice per i requisiti ed eseguirlo in Visual Studio o in un altro strumento di progettazione.

È necessario installare il pacchetto MQTnet (versione 4.1.4.563) da NuGet per eseguire questo codice. In Visual Studio fare clic con il pulsante destro del mouse sul nome del progetto in Esplora soluzioni, scegliere Gestisci pacchetti NuGet e cercare MQTTnet. Selezionare pacchetto MQTTnet e installare.

Annotazioni

Il codice di esempio seguente è solo a scopo dimostrativo e non è destinato all'uso in produzione.

Codice C# di esempio per connettere un client, pubblicare e sottoscrivere un messaggio MQTT in un argomento

Importante

Aggiornare i percorsi del certificato client e del file pem della chiave in base alla posizione dei file di certificato client. Assicurati inoltre che il nome di autenticazione del client e le informazioni sull'argomento corrispondano alla tua configurazione.

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

È possibile replicare e modificare lo stesso codice per più client per pubblicare e sottoscrivere tra i client.

Per gli esempi di codice, passare a questo repository GitHub.