Freigeben über


Entwickeln verteilter Anwendungsworkloads mit MQTTnet

MQTTnet- ist eine Open-Source-, .NET-Hochleistungsbibliothek für MQTT-basierte Kommunikation. In diesem Artikel wird erläutert, wie Sie ein Kubernetes-Dienstkontotoken und MQTTnet verwenden, um eine Verbindung mit dem MQTT-Broker herzustellen. Verwenden Sie Dienstkontotoken, um In-Cluster-Anwendungen zu verbinden.

Beispielcode

Der Beispielcode führt folgende Aktionen aus:

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

    var mqttFactory = new MqttFactory();
    var mqttClient = mqttFactory.CreateMqttClient();
    
  2. Die Kubernetes-Podspezifikation stellt das Dienstkonto im Containerdateisystem bereit, und der Dateiinhalt wird gelesen. Das bereitgestellte Token wird als Kennwort mit dem bekannten Benutzernamen K8S-SATverwendet:

    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. Die MqttClientOptionsBuilderin der Clientdokumentation empfohlene Methode ist die bevorzugte Methode zum Festlegen der Optionen:

    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. Erstellen Sie MQTT-Nachrichten mithilfe von Eigenschaften direkt oder mit MqttApplicationMessageBuilder. Diese Klasse stellt Überladungen zum Behandeln verschiedener Nutzlastformate bereit. Die Builder-API verwendet ein flüssiges Design. Der folgende Code zeigt, wie Sie eine Anwendungsnachricht verfassen und in einem Thema veröffentlichen, das als Sampletopic bezeichnet wird:

    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 die serviceAccountToken.expirationSeconds Einstellung auf 86400 Sekunden festgelegt ist und wenn sie 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:

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

Führen Sie das Beispiel aus, indem Sie den Anweisungen in der INFODATEI folgen.