Condividi tramite


Usare DMQTTnet per sviluppare carichi di lavoro di applicazioni distribuite che si connettono al broker MQTT

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

Codice di esempio

Il codice di esempio esegue i passaggi seguenti:

  1. Crea un client MQTT usando la classe MqttFactory:

    var mqttFactory = new MqttFactory();
    var mqttClient = mqttFactory.CreateMqttClient();
    
  2. La specifica del pod Kubernetes monta l'account del servizio nel file system del contenitore. Il contenuto del file è letto: ##3. Il token montato viene usato come password con un nome utente noto 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 . L'uso di MqttClientOptionsBuilder come consigliato nella documentazione client è il modo consigliato 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. I messaggi MQTT possono essere creati usando direttamente le proprietà o .MqttApplicationMessageBuilder Questa classe include overload che consentono di gestire formati di payload diversi. L'API del generatore è un'API Fluent. Il codice seguente illustra come comporre un messaggio dell'applicazione e pubblicarli in un articolo 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 inoltre che il serviceAccountToken.expirationSeconds è impostato su 86400 secondi e, una volta scaduto, è 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:

  # 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"

Per eseguire l'esempio, seguire le istruzioni riportate in README.