Usar a MQTTnet para desenvolver cargas de trabalho de aplicativos distribuídos que se conectam ao Agente MQTT
O MQTTnet é uma biblioteca .NET de alto desempenho de código aberto para comunicação baseada em MQTT. Este artigo usa um token de conta de serviço do Kubernetes e a MQTTnet para se conectar ao Agente MQTT. Use os tokens da conta de serviço para conectar os aplicativos no cluster.
Código de exemplo
O código de exemplo executa as seguintes etapas:
Cria um cliente MQTT usando a classe
MqttFactory
:var mqttFactory = new MqttFactory(); var mqttClient = mqttFactory.CreateMqttClient();
A especificação de pod do Kubernetes monta a conta de serviço no sistema de arquivos de contêiner. O conteúdo do arquivo é lido: ##3. O token montado é usado como a senha com o nome de usuário já conhecido
K8S-SAT
:static string sat_auth_file = "/var/run/secrets/tokens/mqtt-client-token"; ... var satToken = File.ReadAllBytes(sat_auth_file);
As opções do cliente MQTT são configuradas usando a classe
MqttClientOptions
. Usar oMqttClientOptionsBuilder
conforme orientado na documentação do cliente é a maneira recomendada de definir as opções:var mqttClientOptions = new MqttClientOptionsBuilder() .WithTcpServer(hostname, tcp_port) .WithProtocolVersion(MqttProtocolVersion.V500) .WithClientId("mqtt-client-dotnet") .WithAuthentication("K8S-SAT", satToken);
Depois de configurar as opções do cliente MQTT, uma conexão pode ser estabelecida. O código a seguir mostra como se conectar a um servidor. É possível substituir o
CancellationToken.None
por um CancellationToken válido, se necessário.var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
As mensagens MQTT podem ser criadas usando as propriedades diretamente ou usando
MqttApplicationMessageBuilder
. Esta classe tem sobrecargas que permitem lidar com diferentes formatos de carga. A API do construtor é uma API fluente. O código a seguir mostra como redigir uma mensagem de aplicativo e publicá-la em um artigo chamado sampletopic:var applicationMessage = new MqttApplicationMessageBuilder() .WithTopic("sampletopic") .WithPayload("samplepayload" + counter++) .Build(); await mqttClient.PublishAsync(applicationMessage, CancellationToken.None);
Especificação do pod
O campo serviceAccountName
na configuração do pod deve corresponder à conta de serviço associada ao token que está sendo usado. Além disso, observe que o serviceAccountToken.expirationSeconds
está definido como 86400 segundos e, depois de expirar, você precisará recarregar o token do disco. Essa lógica não é implementada neste exemplo.
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 executar o exemplo, siga as instruções em seu arquivo LEIAME.