Partilhar via


Use o MQTTnet para desenvolver cargas de trabalho de aplicativos distribuídos que se conectam ao broker MQTT

MQTTnet é uma biblioteca .NET de código aberto e alto desempenho para comunicação baseada em MQTT. Este artigo usa um token de conta de serviço Kubernetes e MQTTnet para se conectar ao broker MQTT. Você deve usar tokens de conta de serviço para conectar aplicativos em cluster.

Código de exemplo

O código de exemplo executa as seguintes etapas:

  1. Cria um cliente MQTT usando a MqttFactory classe:

    var mqttFactory = new MqttFactory();
    var mqttClient = mqttFactory.CreateMqttClient();
    
  2. A especificação do pod do Kubernetes monta a conta de serviço no sistema de arquivos do contêiner. O conteúdo do arquivo é lido: ##3. O token montado é usado como a senha com nome K8S-SATde usuário bem conhecido:

    static string sat_auth_file = "/var/run/secrets/tokens/mqtt-client-token";
    ...
    var satToken = File.ReadAllBytes(sat_auth_file);
    
  3. As opções do cliente MQTT são configuradas usando a MqttClientOptions classe. Usar o MqttClientOptionsBuilder conforme aconselhado na documentação do cliente é a maneira aconselhada de definir as opções:

    var mqttClientOptions = new MqttClientOptionsBuilder()
        .WithTcpServer(hostname, tcp_port)
        .WithProtocolVersion(MqttProtocolVersion.V500)
        .WithClientId("mqtt-client-dotnet")
        .WithAuthentication("K8S-SAT", satToken);
    
  4. Depois de configurar as opções do cliente MQTT, uma conexão pode ser estabelecida. O código a seguir mostra como se conectar com um servidor. Você pode substituir o por um CancellationToken válido, CancellationToken.None se necessário.

    var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
    
  5. As mensagens MQTT podem ser criadas usando as propriedades diretamente ou usando MqttApplicationMessageBuildero . Esta classe tem sobrecargas que permitem lidar com diferentes formatos de carga útil. A API do construtor é uma API fluente. O código a seguir mostra como compor uma mensagem de aplicativo e publicá-los 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 serviceAccountName campo 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, uma vez expirado, você precisa recarregar o token do disco. Essa lógica não está 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 LEIA-ME.