다음을 통해 공유


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으로 바꿀 CancellationToken.None 수 있습니다.

    var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
    
  5. MQTT 메시지는 속성을 직접 사용하거나 사용하여 MqttApplicationMessageBuilder만들 수 있습니다. 이 클래스에는 다른 페이로드 형식을 처리할 수 있는 오버로드가 있습니다. 작성기의 API는 흐름 API입니다. 다음 코드에서는 애플리케이션 메시지를 작성하고 sampletopic이라는 문서에 게시하는 방법을 보여 있습니다.

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

Pod 사양

Pod 구성의 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에 있는 지침을 따릅니다.