你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
MQTTnet 是一个开源的高性能 .NET 库,用于基于 MQTT 的通信。 本文介绍如何使用 Kubernetes 服务帐户令牌和 MQTTnet 连接到 MQTT 代理。 使用服务帐户令牌连接群集内应用程序。
代码示例
示例代码执行以下作:
使用
MqttFactory
类创建 MQTT 客户端:var mqttFactory = new MqttFactory(); var mqttClient = mqttFactory.CreateMqttClient();
Kubernetes Pod 规范在容器文件系统上装载服务帐户,并读取文件内容。 已装载的令牌将用作已知用户名
K8S-SAT
的密码:static string sat_auth_file = "/var/run/secrets/tokens/mqtt-client-token"; ... var satToken = File.ReadAllBytes(sat_auth_file);
MQTT 客户端选项是使用
MqttClientOptions
类配置的。MqttClientOptionsBuilder
如客户端文档中建议的那样,这是设置选项的首选方法:var mqttClientOptions = new MqttClientOptionsBuilder() .WithTcpServer(hostname, tcp_port) .WithProtocolVersion(MqttProtocolVersion.V500) .WithClientId("mqtt-client-dotnet") .WithAuthentication("K8S-SAT", satToken);
设置 MQTT 客户端选项后,即可建立连接。 以下代码显示如何与服务器连接。 如果需要,可以将
CancellationToken.None
替换为有效的 CancellationToken。var response = await mqttClient.ConnectAsync(mqttClientOptions.Build(), CancellationToken.None);
直接使用属性创建 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文件中的说明运行该示例。