Compartir vía


Uso de MQTTnet para desarrollar cargas de trabajo de aplicaciones distribuidas que se conectan al corredor MQTT

MQTTnet es una biblioteca de .NET de alto rendimiento y de código abierto para la comunicación basada en MQTT. En este artículo se usa un token de cuenta de servicio de Kubernetes y MQTTnet para conectarse al corredor MQTT. Debe usar tokens de cuenta de servicio para conectarse aplicaciones en clúster.

Código de ejemplo

El código de ejemplo realiza los pasos siguientes:

  1. Crea un cliente MQTT mediante la clase MqttFactory:

    var mqttFactory = new MqttFactory();
    var mqttClient = mqttFactory.CreateMqttClient();
    
  2. La especificación del pod de Kubernetes monta la cuenta de servicio en el sistema de archivos de contenedor. El contenido del archivo se lee: ##3.. El token montado se usa como contraseña con un nombre de usuario conocido K8S-SAT:

    static string sat_auth_file = "/var/run/secrets/tokens/mqtt-client-token";
    ...
    var satToken = File.ReadAllBytes(sat_auth_file);
    
  3. Las opciones de cliente MQTT se configuran mediante la clase MqttClientOptions. El uso del MqttClientOptionsBuilder tal como se recomienda en la documentación de cliente es la manera recomendada de establecer las opciones:

    var mqttClientOptions = new MqttClientOptionsBuilder()
        .WithTcpServer(hostname, tcp_port)
        .WithProtocolVersion(MqttProtocolVersion.V500)
        .WithClientId("mqtt-client-dotnet")
        .WithAuthentication("K8S-SAT", satToken);
    
  4. Después de configurar las opciones de cliente MQTT, se puede establecer una conexión. En el código siguiente se muestra cómo conectarse con un servidor. Puede reemplazar el CancellationToken.None por un CancellationToken válido, si es necesario.

    var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
    
  5. Los mensajes MQTT se pueden crear mediante las propiedades directamente o mediante MqttApplicationMessageBuilder. Esta clase tiene sobrecargas que permiten trabajar con diferentes formatos de carga. La API del generador es una API fluida. El código siguiente muestra cómo redactar un mensaje de aplicación y publicarlo en un artículo denominado sampletopic:

    var applicationMessage = new MqttApplicationMessageBuilder()
        .WithTopic("sampletopic")
        .WithPayload("samplepayload" + counter++)
        .Build();
    
    await mqttClient.PublishAsync(applicationMessage, CancellationToken.None);
    

Especificación del pod

El serviceAccountName campo de la configuración del pod debe coincidir con la cuenta de servicio asociada al token que se está usando. Además, tenga en cuenta que el serviceAccountToken.expirationSeconds se establece en 86400 segundosy, una vez que expire, debe volver a cargar el token desde el disco. Esta lógica no se implementa en este ejemplo.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: mqtt-client
  namespace: azure-iot-operations

---
apiVersion: v1
kind: Pod
metadata:
  name: mqtt-client-dotnet
  namespace: azure-iot-operations
spec:
  serviceAccountName: mqtt-client

  volumes:

  # SAT token used to authenticate between the application and the MQTT broker  
  - name: mqtt-client-token
    projected:
      sources:
      - serviceAccountToken:
          path: mqtt-client-token
          audience: aio-internal
          expirationSeconds: 86400

  # Certificate chain for the application to validate the MQTT broker              
  - name: aio-ca-trust-bundle
    configMap:
      name: azure-iot-operations-aio-ca-trust-bundle

  containers:
  - name: mqtt-client-dotnet
    image: ghcr.io/azure-samples/explore-iot-operations/mqtt-client-dotnet:latest
    volumeMounts:
    - name: mqtt-client-token
      mountPath: /var/run/secrets/tokens/
    - name: aio-ca-trust-bundle
      mountPath: /var/run/certs/aio-internal-ca-cert/
    env:
    - name: hostname
      value: "aio-broker"
    - name: tcpPort
      value: "18883"
    - name: useTls
      value: "true"
    - name: caFile
      value: "/var/run/certs/aio-internal-ca-cert/ca.crt"
    - name: satAuthFile
      value: "/var/run/secrets/tokens/mqtt-client-token"

Para ejecutar el ejemplo, siga las instrucciones de su LÉAME.