共用方式為


使用 MQTTnet 開發連線到 MQTT 代理的分散式應用程式工作負載

MQTTnet 是適用於 MQTT 型通訊的開放原始碼高效能 .NET 程式庫。 本文使用 Kubernetes 服務帳戶權杖和 MQTTnet 來連線到 MQTT 代理。 您應該使用服務帳戶令牌來連線叢集中的應用程式。

範例指令碼

範例程式碼會執行下列步驟:

  1. 使用 MqttFactory 類別建立 MQTT 用戶端:

    var mqttFactory = new MqttFactory();
    var mqttClient = mqttFactory.CreateMqttClient();
    
  2. Kubernetes Pod 規格會在容器文件系統上掛接服務帳戶。 檔案的內容會讀取: ##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. 您可以直接使用 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"

若要執行範例,請遵循讀我檔案中的指示。