使用 MQTTnet 開發連線到 MQTT 代理的分散式應用程式工作負載
MQTTnet 是適用於 MQTT 型通訊的開放原始碼高效能 .NET 程式庫。 本文使用 Kubernetes 服務帳戶權杖和 MQTTnet 來連線到 MQTT 代理。 您應該使用服務帳戶令牌來連線叢集中的應用程式。
範例指令碼
範例程式碼會執行下列步驟:
使用
MqttFactory
類別建立 MQTT 用戶端:var mqttFactory = new MqttFactory(); var mqttClient = mqttFactory.CreateMqttClient();
Kubernetes Pod 規格會在容器文件系統上掛接服務帳戶。 檔案的內容會讀取: ##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);
您可以直接使用
MqttApplicationMessageBuilder
屬性或使用 來建立 MQTT 訊息。 這個類別具有多載,允許處理不同的承載格式。 建立器的 API 是 Fluent API。 下列程式代碼示範如何撰寫應用程式訊息,並將其發佈至稱為 sampletopic的文章:var applicationMessage = new MqttApplicationMessageBuilder() .WithTopic("sampletopic") .WithPayload("samplepayload" + counter++) .Build(); await mqttClient.PublishAsync(applicationMessage, CancellationToken.None);
Pod 規格
Pod 設定中的 serviceAccountName
欄位必須符合與所使用權杖相關聯的服務帳戶。 此外,請注意,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"
若要執行範例,請遵循讀我檔案中的指示。