Uso de MQTTnet para desarrollar cargas de trabajo de aplicaciones distribuidas que se conectan al corredor MQTT
MQTTnet es una biblioteca de .NET de alto rendimiento y de código abierto para la comunicación basada en MQTT. En este artículo se usa un token de cuenta de servicio de Kubernetes y MQTTnet para conectarse al corredor MQTT. Debe usar tokens de cuenta de servicio para conectarse aplicaciones en clúster.
Código de ejemplo
El código de ejemplo realiza los pasos siguientes:
Crea un cliente MQTT mediante la clase
MqttFactory
:var mqttFactory = new MqttFactory(); var mqttClient = mqttFactory.CreateMqttClient();
La especificación del pod de Kubernetes monta la cuenta de servicio en el sistema de archivos de contenedor. El contenido del archivo se lee: ##3.. El token montado se usa como contraseña con un nombre de usuario conocido
K8S-SAT
:static string sat_auth_file = "/var/run/secrets/tokens/mqtt-client-token"; ... var satToken = File.ReadAllBytes(sat_auth_file);
Las opciones de cliente MQTT se configuran mediante la clase
MqttClientOptions
. El uso delMqttClientOptionsBuilder
tal como se recomienda en la documentación de cliente es la manera recomendada de establecer las opciones:var mqttClientOptions = new MqttClientOptionsBuilder() .WithTcpServer(hostname, tcp_port) .WithProtocolVersion(MqttProtocolVersion.V500) .WithClientId("mqtt-client-dotnet") .WithAuthentication("K8S-SAT", satToken);
Después de configurar las opciones de cliente MQTT, se puede establecer una conexión. En el código siguiente se muestra cómo conectarse con un servidor. Puede reemplazar el
CancellationToken.None
por un CancellationToken válido, si es necesario.var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
Los mensajes MQTT se pueden crear mediante las propiedades directamente o mediante
MqttApplicationMessageBuilder
. Esta clase tiene sobrecargas que permiten trabajar con diferentes formatos de carga. La API del generador es una API fluida. El código siguiente muestra cómo redactar un mensaje de aplicación y publicarlo en un artículo denominado sampletopic:var applicationMessage = new MqttApplicationMessageBuilder() .WithTopic("sampletopic") .WithPayload("samplepayload" + counter++) .Build(); await mqttClient.PublishAsync(applicationMessage, CancellationToken.None);
Especificación del pod
El serviceAccountName
campo de la configuración del pod debe coincidir con la cuenta de servicio asociada al token que se está usando. Además, tenga en cuenta que el serviceAccountToken.expirationSeconds
se establece en 86400 segundosy, una vez que expire, debe volver a cargar el token desde el disco. Esta lógica no se implementa en este ejemplo.
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"
Para ejecutar el ejemplo, siga las instrucciones de su LÉAME.