Partager via


Développer des charges de travail d’application distribuées avec MQTTnet

MQTTnet est une bibliothèque .NET open source et à hautes performances pour la communication basée sur MQTT. Cet article explique comment utiliser un jeton de compte de service Kubernetes et MQTTnet pour se connecter au répartiteur MQTT. Utilisez des jetons de compte de service pour connecter des applications en cluster.

Exemple de code

L’exemple de code effectue les opérations suivantes :

  1. Crée un client MQTT à l’aide de la classe MqttFactory :

    var mqttFactory = new MqttFactory();
    var mqttClient = mqttFactory.CreateMqttClient();
    
  2. La spécification du pod Kubernetes monte le compte de service sur le système de fichiers de conteneur et le contenu du fichier est lu. Le jeton monté est utilisé comme mot de passe avec le nom d’utilisateur connu K8S-SAT :

    static string sat_auth_file = "/var/run/secrets/tokens/mqtt-client-token";
    ...
    var satToken = File.ReadAllBytes(sat_auth_file);
    
  3. Les options du client MQTT sont configurées à l’aide de la classe MqttClientOptions. La MqttClientOptionsBuilderméthode recommandée dans la documentation du client est la meilleure façon de définir les options :

    var mqttClientOptions = new MqttClientOptionsBuilder()
        .WithTcpServer(hostname, tcp_port)
        .WithProtocolVersion(MqttProtocolVersion.V500)
        .WithClientId("mqtt-client-dotnet")
        .WithAuthentication("K8S-SAT", satToken);
    
  4. Après avoir configuré les options du client MQTT, une connexion peut être établie. Le code suivant montre comment se connecter à un serveur. Vous pouvez remplacer CancellationToken.None par un CancellationToken valide si nécessaire.

    var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
    
  5. Créez des messages MQTT à l’aide de propriétés directement ou avec MqttApplicationMessageBuilder. Cette classe fournit des surcharges pour gérer différents formats de charges utiles. L’API builder utilise une conception fluide. Le code suivant montre comment composer un message d’application et le publier dans une rubrique appelée sampletopic :

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

Spécification de pod

Le champ serviceAccountName de la configuration du pod doit correspondre au compte de service associé au jeton utilisé. Notez également que le jeton serviceAccountToken.expirationSeconds est défini sur 86400 secondes et, quand il expire, vous devez recharger le jeton à partir du disque. Cette logique n’est pas implémentée dans cet exemple.

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"

Exécutez l’exemple en suivant les instructions de son fichier README.