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:
Erstellt einen MQTT-Client mithilfe der
MqttFactory
-Klasse:var mqttFactory = new MqttFactory(); var mqttClient = mqttFactory.CreateMqttClient();
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);
Die MQTT-Clientoptionen werden mithilfe der
MqttClientOptions
-Klasse konfiguriert. Zum Festlegen der Optionen wird die Verwendung vonMqttClientOptionsBuilder
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);
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);
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.