Compartir a través de


Desarrollo de cargas de trabajo de aplicaciones distribuidas con MQTTnet

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 explica cómo usar un token de cuenta de servicio de Kubernetes y MQTTnet para conectarse al agente MQTT. Utilice tokens de cuenta de servicio para conectar aplicaciones dentro del clúster.

Código de ejemplo

El código de ejemplo hace lo siguiente:

  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, y se lee el contenido del archivo. El token montado se usa como contraseña con el conocido nombre de usuario 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. MqttClientOptionsBuilder, como se recomienda en la documentación del cliente, es la forma preferida 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. Cree mensajes MQTT mediante propiedades directamente o con MqttApplicationMessageBuilder. Esta clase proporciona sobrecargas para controlar diferentes formatos de carga. La API de construcción utiliza un diseño fluido. En el código siguiente se muestra cómo redactar un mensaje de aplicación y publicarlo en un tema 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 segundos y, cuando 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:

  # The SAT token authenticates the application with 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"

Ejecute la muestra siguiendo las instrucciones de su README.