Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 explica cómo usar un token de cuenta de servicio de Kubernetes y MQTTnet para conectarse al agente MQTT. Utilice tokens de cuenta de servicio para conectar aplicaciones dentro del clúster.
Código de ejemplo
El código de ejemplo hace lo siguiente:
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, y se lee el contenido del archivo. El token montado se usa como contraseña con el conocido nombre de usuario
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
.MqttClientOptionsBuilder
, como se recomienda en la documentación del cliente, es la forma preferida 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);
Cree mensajes MQTT mediante propiedades directamente o con
MqttApplicationMessageBuilder
. Esta clase proporciona sobrecargas para controlar diferentes formatos de carga. La API de construcción utiliza un diseño fluido. En el código siguiente se muestra cómo redactar un mensaje de aplicación y publicarlo en un tema 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 segundos y, cuando 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:
# 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"
Ejecute la muestra siguiendo las instrucciones de su README.