Dela via


Utveckla distribuerade programarbetsbelastningar med MQTTnet

MQTTnet är ett .NET-bibliotek med öppen källkod med höga prestanda för MQTT-baserad kommunikation. Den här artikeln beskriver hur du använder en Kubernetes-tjänstkontotoken och MQTTnet för att ansluta till MQTT-koordinator. Använd tjänstkontotoken för att ansluta program i kluster.

Exempelkod

Exempelkoden gör följande:

  1. Skapar en MQTT-klient med hjälp av MqttFactory klassen:

    var mqttFactory = new MqttFactory();
    var mqttClient = mqttFactory.CreateMqttClient();
    
  2. Kubernetes-poddspecifikationen monterar tjänstkontot i containerfilsystemet och filinnehållet läses. Den monterade token används som lösenord med det välkända användarnamnet K8S-SAT:

    static string sat_auth_file = "/var/run/secrets/tokens/mqtt-client-token";
    ...
    var satToken = File.ReadAllBytes(sat_auth_file);
    
  3. MQTT-klientalternativen konfigureras med hjälp av MqttClientOptions klassen. , MqttClientOptionsBuildersom rekommenderas i klientdokumentationen , är det bästa sättet att ange alternativen:

    var mqttClientOptions = new MqttClientOptionsBuilder()
        .WithTcpServer(hostname, tcp_port)
        .WithProtocolVersion(MqttProtocolVersion.V500)
        .WithClientId("mqtt-client-dotnet")
        .WithAuthentication("K8S-SAT", satToken);
    
  4. När du har konfigurerat MQTT-klientalternativen kan en anslutning upprättas. Följande kod visar hur du ansluter till en server. Du kan ersätta CancellationToken.None med en giltig AnnulleringToken om det behövs.

    var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
    
  5. Skapa MQTT-meddelanden med hjälp av egenskaper direkt eller med MqttApplicationMessageBuilder. Den här klassen innehåller överlagringar för hantering av olika nyttolastformat. Bygg-API:et använder en flytande design. Följande kod visar hur du skriver ett programmeddelande och publicerar det till ett ämne som kallas sampletopic:

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

Poddspecifikation

Fältet serviceAccountName i poddkonfigurationen måste matcha det tjänstkonto som är associerat med den token som används. Observera också att serviceAccountToken.expirationSeconds är inställt på 86400 sekunder, och när den upphör att gälla måste du läsa in token igen från disken. Den här logiken implementeras inte i det här exemplet.

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"

Kör exemplet genom att följa anvisningarna i README-filen.