Condividi tramite


Sviluppare carichi di lavoro di applicazioni distribuiti con MQTTnet

MQTTnet è una libreria .NET open source ad alte prestazioni per la comunicazione basata su MQTT. Questo articolo illustra come usare un token dell'account del servizio Kubernetes e MQTnet per connettersi al broker MQTT. Usare i token dell'account del servizio per connettere le applicazioni nel cluster.

Codice di esempio

Il codice di esempio esegue le operazioni seguenti:

  1. Crea un client MQTT usando la classe MqttFactory:

    var mqttFactory = new MqttFactory();
    var mqttClient = mqttFactory.CreateMqttClient();
    
  2. La specifica del pod di Kubernetes monta l'account di servizio nel file system del contenitore e il contenuto del file viene letto. Il token montato viene usato come password con il noto nome utente K8S-SAT:

    static string sat_auth_file = "/var/run/secrets/tokens/mqtt-client-token";
    ...
    var satToken = File.ReadAllBytes(sat_auth_file);
    
  3. Le opzioni client MQTT vengono configurate usando la MqttClientOptions classe . MqttClientOptionsBuilder, come consigliato nella documentazione del client, è il modo migliore per impostare le opzioni:

    var mqttClientOptions = new MqttClientOptionsBuilder()
        .WithTcpServer(hostname, tcp_port)
        .WithProtocolVersion(MqttProtocolVersion.V500)
        .WithClientId("mqtt-client-dotnet")
        .WithAuthentication("K8S-SAT", satToken);
    
  4. Dopo aver configurato le opzioni client MQTT, è possibile stabilire una connessione. Nel codice seguente viene illustrato come connettersi a un server. Se necessario, è possibile sostituire con CancellationToken.None un cancellationToken valido.

    var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
    
  5. Creare messaggi MQTT usando proprietà direttamente o con MqttApplicationMessageBuilder. Questa classe fornisce sovraccarichi per la gestione di formati di payload diversi. L'API builder usa una progettazione fluente. Il codice seguente illustra come comporre un messaggio dell'applicazione e pubblicarlo in un argomento denominato sampletopic:

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

Specifica del pod

Il campo serviceAccountName nella configurazione del pod deve corrispondere all'account del servizio associato al token usato. Si noti anche che serviceAccountToken.expirationSeconds è impostato su 86400 secondi e quando scade, è necessario ricaricare il token dal disco. Questa logica non viene implementata in questo esempio.

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"

Eseguire l'esempio seguendo le istruzioni nel file README.