Share via


Inicio rápido: Publicación y suscripción a mensajes MQTT en un espacio de nombres de Event Grid con la CLI de Azure

La característica MQTT broker de Azure Event Grid admite la mensajería mediante el protocolo MQTT. Los clientes (dispositivos y aplicaciones en la nube) pueden publicar y suscribirse a mensajes MQTT en temas jerárquicos flexibles para escenarios como la difusión a gran escala y comando y control.

En este artículo, vas a usar la CLI de Azure para lo siguiente:

  • Crear un espacio de nombres de Event Grid y habilitar MQTT broker.
  • Crear subrecursos como clientes, grupos de clientes y espacios de temas.
  • Conceder a los clientes acceso para publicar y suscribirse a espacios de temas.
  • Publicar y recibir mensajes MQTT.

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Requisitos previos

  • Si no conoces bien Event Grid, lee la Introducción a Event Grid antes de iniciar este tutorial.
  • Registre el proveedor de recursos de Event Grid según los pasos descritos en Registro del proveedor de recursos de Event Grid.
  • Asegúrese de que el puerto 8883 está abierto en el firewall. En el ejemplo de este tutorial se usa el protocolo MQTT, que se comunica mediante el puerto 8883. Este puerto puede estar bloqueado en algunos entornos de red corporativos y educativos.
  • Use el entorno de Bash en Azure Cloud Shell. Para más información, consulte Inicio rápido para Bash en Azure Cloud Shell.
  • Si prefiere ejecutar comandos de referencia de la CLI localmente, instale la CLI de Azure. Si utilizas Windows o macOS, considera la posibilidad de ejecutar la CLI de Azure en un contenedor Docker. Para más información, consulta Ejecución de la CLI de Azure en un contenedor de Docker.
  • Si usa una instalación local, inicie sesión en la CLI de Azure mediante el comando az login. Sigue los pasos que se muestran en el terminal para completar el proceso de autenticación. Para ver otras opciones de inicio de sesión, consulte Inicio de sesión con la CLI de Azure.
  • En caso de que se le solicite, instale las extensiones de la CLI de Azure la primera vez que la use. Para más información sobre las extensiones, consulte Uso de extensiones con la CLI de Azure.
  • Ejecute az version para buscar cuál es la versión y las bibliotecas dependientes que están instaladas. Para realizar la actualización a la versión más reciente, ejecute az upgrade.
  • En este artículo se necesita la versión 2.53.1, o versiones posteriores, de la CLI de Azure. Si usa Azure Cloud Shell, ya está instalada la versión más reciente.
  • Necesita un certificado de cliente X.509 para generar la huella digital y autenticar la conexión de cliente.
  • Revisa la documentación de la CLI del espacio de nombres de Event Grid.

Generación de un certificado de cliente de ejemplo y una huella digital

Si aún no tienes un certificado, puedes crear uno de ejemplo mediante la CLI de Step. Considere la posibilidad de instalar manualmente para Windows.

Después de una instalación correcta mediante la CLI de Step, abre un símbolo del sistema en la carpeta de perfil de usuario (Win+R escribe %USERPROFILE%).

  1. Para crear certificados raíz e intermedios, ejecute el siguiente comando. Recuerda la contraseña, que deberás utilizar en el siguiente paso.

    step ca init --deployment-type standalone --name MqttAppSamplesCA --dns localhost --address 127.0.0.1:443 --provisioner MqttAppSamplesCAProvisioner
    
  2. Usa los archivos de entidad de certificación (CA) generados a fin de crear un certificado para el cliente. Asegúrate de usar la ruta de acceso correcta para los archivos de certificado y secretos en el 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. Para ver la huella digital, ejecuta el comando Step.

    step certificate fingerprint client1-authnID.pem
    

Creación de un espacio de nombres

Utilice el comando para crear un espacio de nombres. Actualiza el comando con el grupo de recursos y un nombre de espacio de nombres.

az eventgrid namespace create -g {Resource Group} -n {Namespace Name} --topic-spaces-configuration "{state:Enabled}"

Para simplificar el inicio rápido, vas a crear un espacio de nombres con propiedades mínimas. Para obtener pasos detallados sobre la configuración de la red, la seguridad y la residencia de datos en otras páginas del asistente, consulta Creación y administración de un espacio de nombres.

Creación de clientes

Use el comando para crear el cliente. Actualiza el comando con el grupo de recursos y un nombre de espacio de nombres.

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]}"
  • A fin de simplificar el inicio rápido, usarás la coincidencia de huella digital para la autenticación. A fin de obtener los pasos sobre el uso de la cadena de certificados de CA X.509 para la autenticación de cliente, consulta Autenticación de cliente mediante la cadena de certificados.
  • Para este ejercicio, usamos el grupo $all client predeterminado, que incluye todos los clientes del espacio de nombres. Para obtener más información sobre cómo crear grupos de clientes personalizados con atributos de cliente, consulta Grupos de clientes.

Creación de espacios de temas

Use el comando para crear el espacio del tema. Actualiza el comando con el grupo de recursos, el nombre del espacio de nombres y un nombre del espacio de temas.

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

Creación de enlaces de permisos

Usa el comando az eventgrid a fin de crear el primer enlace de permisos para el permiso de publicador. Actualiza el comando con el grupo de recursos, el nombre del espacio de nombres y un nombre de enlace de permisos.

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}

Use el comando para crear el segundo enlace de permisos. Actualiza el comando con el grupo de recursos, el nombre del espacio de nombres y un nombre de enlace de permisos. Este enlace de permisos es para los suscriptores.

az eventgrid namespace permission-binding create -g {Resource Group} --namespace-name {Namespace Name} -n {Name of second Permission Binding} --client-group-name '$all' --permission publisher --topic-space-name {Topicspace Name}

Publicación y suscripción a mensajes MQTT

El código de ejemplo siguiente es un publicador de .NET sencillo que intenta conectarse y publicar en un espacio de nombres y se suscribe al tema MQTT. Puedes usar el código para modificarlo según tus necesidades y ejecutar el código en Visual Studio o en cualquiera de tus herramientas favoritas.

Debe instalar el paquete MQTTnet (versión 4.1.4.563) desde NuGet para ejecutar este código. (En Visual Studio, haz clic con el botón derecho en el nombre del proyecto en el Explorador de soluciones, ve a Administrar paquetes NuGet y busca MQTTnet. Selecciona Paquete MQTTnet e instálalo).

Nota:

El siguiente código de ejemplo solo es una demostración y no está destinado para un uso en producción.

Código de C# de ejemplo para conectar un cliente, publicar y suscribirse a un mensaje MQTT en un tema

Importante

Actualiza las rutas de acceso del archivo pem de certificado de cliente y clave en función de la ubicación de los archivos de certificado de cliente. Además, asegúrate de que el nombre de autenticación de cliente y la información del tema coinciden con la configuración.

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

Puedes replicar y modificar el mismo código para que varios clientes realicen la publicación o suscripción entre los clientes.

Pasos siguientes