次の方法で共有


MQTTnet を使用して分散アプリケーション ワークロードを開発する

MQTTnet は、MQTT ベースの通信用の、オープンソースのハイ パフォーマンス .NET ライブラリです。 この記事では、Kubernetes サービス アカウント トークンと MQTTnet を使用して MQTT ブローカーに接続する方法について説明します。 サービス アカウント トークンを使用して、クラスター内アプリケーションに接続します。

サンプル コード

サンプル コードでは、次の処理が行われます。

  1. MqttFactory クラスを使用して MQTT クライアントを作成します。

    var mqttFactory = new MqttFactory();
    var mqttClient = mqttFactory.CreateMqttClient();
    
  2. 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. プロパティを直接使用するか、 MqttApplicationMessageBuilderを使用して MQTT メッセージを作成します。 このクラスは、さまざまなペイロード形式を処理するためのオーバーロードを提供します。 ビルダーAPIでは、流暢なデザインが使用されています。 次のコードは、アプリケーション メッセージを作成し、 sampletopic というトピックに発行する方法を示しています。

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

ポッド仕様

ポッド構成の serviceAccountName フィールドは、使用されているトークンに関連付けられているサービス アカウントと一致する必要があります。 また、 serviceAccountToken.expirationSeconds86400 秒に設定されており、有効期限が切れると、ディスクからトークンを再読み込みする必要があることに注意してください。 このロジックは、このサンプルでは実装されていません。

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 の手順に従ってサンプルを実行します。