次の方法で共有


MQTTnet を使用して MQTT ブローカーに接続する分散型アプリケーションのワークロードを開発する

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

サンプル コード

サンプル コードでは、次の手順を実行します。

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

    var mqttFactory = new MqttFactory();
    var mqttClient = mqttFactory.CreateMqttClient();
    
  2. 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 クラスを使用して構成されます。 オプションを設定する方法として、client のドキュメントで説明されているように、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 は Fluent 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:

  # 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 の指示に従います。