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:
Crea un client MQTT usando la classe
MqttFactory
:var mqttFactory = new MqttFactory(); var mqttClient = mqttFactory.CreateMqttClient();
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);
Le opzioni client MQTT vengono configurate usando la
MqttClientOptions
classe . L'uso diMqttClientOptionsBuilder
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);
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);
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.