你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 MQTTnet 开发分布式应用程序工作负荷

MQTTnet 是一个开源的高性能 .NET 库,用于基于 MQTT 的通信。 本文介绍如何使用 Kubernetes 服务帐户令牌和 MQTTnet 连接到 MQTT 代理。 使用服务帐户令牌连接群集内应用程序。

代码示例

示例代码执行以下作:

  1. 使用 MqttFactory 类创建 MQTT 客户端:

    var mqttFactory = new MqttFactory();
    var mqttClient = mqttFactory.CreateMqttClient();
    
  2. Kubernetes Pod 规范在容器文件系统上装载服务帐户,并读取文件内容。 已装载的令牌将用作已知用户名 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.None 替换为有效的 CancellationToken。

    var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
    
  5. 直接使用属性创建 MQTT 消息或使用 MqttApplicationMessageBuilder 进行创建。 此类提供重载以处理不同格式的有效负载。 生成器 API 使用流畅的设计。 以下代码演示如何撰写应用程序消息并将其发布到名为 sampletopic 的主题:

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

Pod 规范

Pod 配置中的 serviceAccountName 字段必须与所使用令牌的关联服务帐户相匹配。 此外,请注意,serviceAccountToken.expirationSeconds 被设置为 86400 秒,当它过期时,需要从磁盘重新读取令牌。 此示例中未实现此逻辑。

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"

按照 README文件中的说明运行该示例。