Teilen über


Verwenden von MQTTnet zum Entwickeln verteilter Anwendungsworkloads, die eine Verbindung mit dem MQTT-Broker herstellen

MQTTnet- ist eine Open-Source-, .NET-Hochleistungsbibliothek für MQTT-basierte Kommunikation. In diesem Artikel werden ein Kubernetes-Dienstkontotoken und MQTTnet zum Herstellen einer Verbindung mit dem MQTT-Broker verwendet. Sie sollten Dienstkontotoken verwenden, um eine Verbindung mit Anwendungen im Cluster herzustellen.

Beispielcode

Der Beispielcode führt die folgenden Schritte aus:

  1. Erstellt einen MQTT-Client mithilfe der MqttFactory-Klasse:

    var mqttFactory = new MqttFactory();
    var mqttClient = mqttFactory.CreateMqttClient();
    
  2. Die Kubernetes-Podspezifikation bindet das Dienstkonto in das Containerdateisystem ein. Der Inhalt der Datei wird gelesen: ##3. Das eingebundene Token wird als Kennwort mit dem bekannten Benutzernamen K8S-SAT verwendet:

    static string sat_auth_file = "/var/run/secrets/tokens/mqtt-client-token";
    ...
    var satToken = File.ReadAllBytes(sat_auth_file);
    
  3. Die MQTT-Clientoptionen werden mithilfe der MqttClientOptions-Klasse konfiguriert. Zum Festlegen der Optionen wird die Verwendung von MqttClientOptionsBuilder gemäß der Vorgehensweise in der Clientdokumentation empfohlen:

    var mqttClientOptions = new MqttClientOptionsBuilder()
        .WithTcpServer(hostname, tcp_port)
        .WithProtocolVersion(MqttProtocolVersion.V500)
        .WithClientId("mqtt-client-dotnet")
        .WithAuthentication("K8S-SAT", satToken);
    
  4. Nachdem Sie die MQTT-Clientoptionen eingerichtet haben, kann eine Verbindung hergestellt werden. Der folgende Code zeigt, wie eine Verbindung mit einem Server hergestellt wird. Sie können CancellationToken.None bei Bedarf durch ein gültiges CancellationToken ersetzen.

    var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
    
  5. MQTT-Nachrichten können mithilfe der Eigenschaften direkt oder mit MqttApplicationMessageBuilder erstellt werden. Diese Klasse verfügt über Überladungen, die den Umgang mit verschiedenen Nutzdatenformaten ermöglichen. Die API des Generators ist eine Fluent-API. Der folgende Code zeigt, wie Sie eine Anwendungsnachricht verfassen und in einem Artikel namens sampletopic veröffentlichen:

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

Podspezifikation

Das serviceAccountName-Feld muss in der Podkonfiguration mit dem Dienstkonto übereinstimmen, das dem verwendeten Token zugeordnet ist. Beachten Sie außerdem, dass serviceAccountToken.expirationSeconds auf 86400 Sekunden festgelegt ist, und sobald die Zeit abläuft, müssen Sie das Token vom Datenträger neu laden. Diese Logik wird in diesem Beispiel nicht implementiert.

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"

Führen Sie zum Ausführen des Beispiels die Anweisungen in der Infodatei aus.