Поделиться через


Разработка распределенных рабочих нагрузок приложений с помощью MQTTnet

MQTTnet — это библиотека с открытым кодом, высокопроизводительная библиотека .NET для обмена данными на основе MQTT. В этой статье объясняется, как использовать маркер учетной записи службы Kubernetes и MQTTnet для подключения к брокеру MQTT. Используйте токены учетной записи службы для подключения приложений в кластер.

Пример кода

В примере кода выполняется следующее:

  1. Создает клиент MQTT с помощью MqttFactory класса:

    var mqttFactory = new MqttFactory();
    var mqttClient = mqttFactory.CreateMqttClient();
    
  2. Спецификация pod Kubernetes монтирует учетную запись сервиса на файловую систему контейнера, и содержимое файла прочитывается. Монтированный токен используется в качестве пароля с именем пользователя K8S-SAT:

    static string sat_auth_file = "/var/run/secrets/tokens/mqtt-client-token";
    ...
    var satToken = File.ReadAllBytes(sat_auth_file);
    
  3. Параметры клиента MQTT настраиваются с помощью MqttClientOptions класса. Как рекомендовано в документации клиента, MqttClientOptionsBuilder это предпочитаемый способ задать параметры:

    var mqttClientOptions = new MqttClientOptionsBuilder()
        .WithTcpServer(hostname, tcp_port)
        .WithProtocolVersion(MqttProtocolVersion.V500)
        .WithClientId("mqtt-client-dotnet")
        .WithAuthentication("K8S-SAT", satToken);
    
  4. После настройки параметров клиента MQTT можно установить подключение. В следующем коде показано, как подключиться к серверу. При необходимости можно заменить CancellationToken.None допустимым элементом CancellationToken.

    var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
    
  5. Создавайте сообщения MQTT с помощью свойств напрямую или с MqttApplicationMessageBuilder. Этот класс предоставляет перегрузки для работы с различными форматами носителей данных. API построителя использует простой дизайн. В следующем коде показано, как создать сообщение приложения и опубликовать его в разделе, называемом sampletopic:

    var applicationMessage = new MqttApplicationMessageBuilder()
        .WithTopic("sampletopic")
        .WithPayload("samplepayload" + counter++)
        .Build();
    
    await mqttClient.PublishAsync(applicationMessage, CancellationToken.None);
    

Спецификация pod

Поле serviceAccountName в конфигурации pod должно соответствовать учетной записи службы, связанной с используемым маркером. Кроме того, обратите внимание, что serviceAccountToken.expirationSeconds установлено значение 86400 секунд, и когда этот срок истекает, необходимо перезагрузить токен с диска. Эта логика не реализована в этом примере.

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"

Запустите пример, руководствуясь инструкциями из его README.