Partager via


Utiliser MQTTnet pour développer des charges de travail d’applications distribuées qui se connectent à l’agent MQTT

MQTTnet est une bibliothèque .NET open source et à hautes performances pour la communication basée sur MQTT. Cet article utilise un jeton de compte de service Kubernetes et MQTTnet pour se connecter à l’agent MQTT. Vous devez utiliser des jetons de compte de service pour vous connecter les applications dans le cluster.

Exemple de code

L’exemple de code effectue les actions 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 conteneur. Le contenu du fichier est lu : ##3. Le jeton monté est utilisé comme mot de passe avec un 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. L’utilisation de MqttClientOptionsBuilder comme indiqué dans la documentation du client est la façon recommandée 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. Les messages MQTT peuvent être créés à l’aide des propriétés directement ou en utilisant MqttApplicationMessageBuilder. Cette classe possède des surcharges qui permettent de gérer différents formats de charge utile. L’API du générateur est une API Fluent. Le code suivant montre comment composer un message d’application et les publier dans une article appelé 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 paramètre serviceAccountToken.expirationSeconds est défini sur 86 400 secondeset une fois qu’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:

  # 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"

Pour exécuter l’exemple, suivez les instructions de son fichier README.