---
id: mqttclient
title: MQTT客户端使用
---

import Tag from "@site/src/components/Tag.js";

### 定义

命名空间:TouchSocket.MQTT <br/>
程序集:[TouchSocket.dll](https://www.nuget.org/packages/TouchSocket)

## 一、说明
`MQTTClient`是遵循MQTT协议的消息客户端,支持连接MQTT Broker、订阅主题、发布消息等功能,支持QoS 0/1/2三种消息质量等级。

## 二、特点
- 轻量级协议支持
- QoS消息质量保障
- 遗嘱消息支持
- 保留消息处理
- TLS加密通信
- 主题通配符匹配(+/#)

## 三、应用场景
- IoT设备数据上报
- 跨平台消息推送
- 低带宽环境通信
- 设备状态同步

## 四、可配置项

<details>
<summary></summary>
<div>

#### SetRemoteIPHost
MQTT Broker地址,格式:
- mqtt://127.0.0.1:1883
- mqtts://broker.emqx.io:8883 (TLS加密)

#### SetClientId
客户端唯一标识,默认自动生成GUID

#### SetKeepAliveInterval
心跳间隔(秒),默认60秒

#### SetCleanSession
清除会话标志,默认true

#### SetWillMessage
配置遗嘱消息:

</div>
</details>

五、支持插件

| 插件接口 | 功能 | | --- | --- | | IMqttConnectingPlugin | 连接Broker前触发 | | IMqttConnectedPlugin | 成功连接后触发 | | IMqttSubscribedPlugin | 订阅主题成功时触发 | | IMqttUnsubscribedPlugin | 取消订阅时触发 | | IMqttMessageReceivedPlugin | 收到消息时触发 |


六、创建MQTT客户端

```csharp {1,4-6,11} showLineNumbers
var mqttClient = new MQTTClient();
mqttClient.Connected = (client, e) => {
    Console.WriteLine($"Connected to {e.Options.Server}");
    return EasyTask.CompletedTask;
};

await mqttClient.SetupAsync(new TouchSocketConfig()
    .SetRemoteIPHost("mqtt://127.0.0.1:1883")
    .SetClientId("device_001"));
    
await mqttClient.ConnectAsync();
```


七、订阅主题

```csharp {1,4-6,11} showLineNumbers
// 订阅单个主题
await mqttClient.SubscribeAsync("home/sensor/temperature", QoSLevel.AtLeastOnce);

// 批量订阅
var topics = new List<MqttSubscribeOption> {
    new("home/+/status", QoSLevel.AtMostOnce),
    new("factory/#", QoSLevel.ExactlyOnce)
};
await mqttClient.SubscribeAsync(topics);
```



八、消息处理

```csharp {1,4-6,11} showLineNumbers
mqttClient.Received = (client, e) => {
    var topic = e.Topic;
    var payload = e.Payload.ToText();
    Console.WriteLine($"收到 [{topic}]: {payload}");
    return EasyTask.CompletedTask;
};
```



九、发布消息

```csharp {1,4-6,11} showLineNumbers
// 发布QoS 0消息
await mqttClient.PublishAsync("device/status", "online", QoSLevel.AtMostOnce);

// 发布保留消息
var message = new MqttPublishMessage {
    Topic = "config/update",
    Payload = Encoding.UTF8.GetBytes("v1.2.0"),
    QoS = QoSLevel.ExactlyOnce,
    Retain = true
};
await mqttClient.PublishAsync(message);

```

十、断线重连

```csharp {1,4-6,11} showLineNumbers
.ConfigurePlugins(a => {
    a.UseMqttReconnection()
     .SetCheckInterval(TimeSpan.FromSeconds(5));
})

```