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


Использование MQTTnet для разработки распределенных рабочих нагрузок приложений, которые подключаются к брокеру MQTT

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

Пример кода

Пример кода выполняет следующие действия.

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

    var mqttFactory = new MqttFactory();
    var mqttClient = mqttFactory.CreateMqttClient();
    
  2. Спецификация pod Kubernetes подключает учетную запись службы в файловой системе контейнера. Содержимое файла считываются: #3. Подключенный маркер используется в качестве пароля с известным именем пользователя 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 построителя — это простой 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:

  # 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"

Чтобы запустить пример, следуйте инструкциям в его README.