Использование MQTTnet для разработки распределенных рабочих нагрузок приложений, которые подключаются к брокеру MQTT
MQTTnet — это библиотека с открытым кодом, высокопроизводительная библиотека .NET для обмена данными на основе MQTT. В этой статье используется маркер учетной записи службы Kubernetes и MQTTnet для подключения к брокеру MQTT. Для подключения к приложениям в кластере следует использовать маркеры учетной записи службы.
Пример кода
Пример кода выполняет следующие действия.
Создает клиент MQTT с помощью
MqttFactory
класса:var mqttFactory = new MqttFactory(); var mqttClient = mqttFactory.CreateMqttClient();
Спецификация pod Kubernetes подключает учетную запись службы в файловой системе контейнера. Содержимое файла считываются: #3. Подключенный маркер используется в качестве пароля с известным именем пользователя
K8S-SAT
:static string sat_auth_file = "/var/run/secrets/tokens/mqtt-client-token"; ... var satToken = File.ReadAllBytes(sat_auth_file);
Параметры клиента MQTT настраиваются с помощью
MqttClientOptions
класса.MqttClientOptionsBuilder
Использование приведенных в документации клиента рекомендуемых способов настройки параметров:var mqttClientOptions = new MqttClientOptionsBuilder() .WithTcpServer(hostname, tcp_port) .WithProtocolVersion(MqttProtocolVersion.V500) .WithClientId("mqtt-client-dotnet") .WithAuthentication("K8S-SAT", satToken);
После настройки параметров клиента MQTT можно установить подключение. В следующем коде показано, как подключиться к серверу. При необходимости можно заменить
CancellationToken.None
допустимым элементом CancellationToken.var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
Сообщения 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.