Utiliser MQTTnet pour développer des charges de travail d’applications distribuées qui se connectent à l’agent MQTT
MQTTnet est une bibliothèque .NET open source et à hautes performances pour la communication basée sur MQTT. Cet article utilise un jeton de compte de service Kubernetes et MQTTnet pour se connecter à l’agent MQTT. Vous devez utiliser des jetons de compte de service pour vous connecter les applications dans le cluster.
Exemple de code
L’exemple de code effectue les actions suivantes :
Crée un client MQTT à l’aide de la classe
MqttFactory
:var mqttFactory = new MqttFactory(); var mqttClient = mqttFactory.CreateMqttClient();
La spécification du pod Kubernetes monte le compte de service sur le système de fichiers conteneur. Le contenu du fichier est lu : ##3. Le jeton monté est utilisé comme mot de passe avec un nom d’utilisateur connu
K8S-SAT
:static string sat_auth_file = "/var/run/secrets/tokens/mqtt-client-token"; ... var satToken = File.ReadAllBytes(sat_auth_file);
Les options du client MQTT sont configurées à l’aide de la classe
MqttClientOptions
. L’utilisation deMqttClientOptionsBuilder
comme indiqué dans la documentation du client est la façon recommandée de définir les options :var mqttClientOptions = new MqttClientOptionsBuilder() .WithTcpServer(hostname, tcp_port) .WithProtocolVersion(MqttProtocolVersion.V500) .WithClientId("mqtt-client-dotnet") .WithAuthentication("K8S-SAT", satToken);
Après avoir configuré les options du client MQTT, une connexion peut être établie. Le code suivant montre comment se connecter à un serveur. Vous pouvez remplacer
CancellationToken.None
par un CancellationToken valide si nécessaire.var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
Les messages MQTT peuvent être créés à l’aide des propriétés directement ou en utilisant
MqttApplicationMessageBuilder
. Cette classe possède des surcharges qui permettent de gérer différents formats de charge utile. L’API du générateur est une API Fluent. Le code suivant montre comment composer un message d’application et les publier dans une article appelé sampletopic :var applicationMessage = new MqttApplicationMessageBuilder() .WithTopic("sampletopic") .WithPayload("samplepayload" + counter++) .Build(); await mqttClient.PublishAsync(applicationMessage, CancellationToken.None);
Spécification de pod
Le champ serviceAccountName
de la configuration du pod doit correspondre au compte de service associé au jeton utilisé. Notez également que le paramètre serviceAccountToken.expirationSeconds
est défini sur 86 400 secondeset une fois qu’il expire, vous devez recharger le jeton à partir du disque. Cette logique n’est pas implémentée dans cet exemple.
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"
Pour exécuter l’exemple, suivez les instructions de son fichier README.