You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

uPLibrary.Networking.M2Mqtt客户端断开连接后是否会自动重连?

uPLibrary.Networking.M2Mqtt v4.3.0 自动重连能力说明

首先明确结论:4.3.0版本的uPLibrary.Networking.M2Mqtt客户端本身没有内置开箱即用的自动重连功能,连接意外断开或首次连接失败后,都需要手动实现重连逻辑。

手动实现重连的通用方案

你可以通过监听客户端的ConnectionClosed事件触发重连逻辑,配合重试间隔、最大重试次数的控制逻辑即可实现稳定的自动重连,核心实现步骤如下:

  • 实例化MqttClient后,注册ConnectionClosed事件回调
  • 在回调中启动重连循环,每次重连前设置间隔时间(避免短时间频繁请求broker),重连成功后停止循环
  • 建议额外在首次调用Connect()方法时也增加重试逻辑,覆盖首次连接失败的场景

示例代码片段

using System.Threading;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;

// 全局重连控制参数
private MqttClient _client;
private bool _isReconnecting = false;
private const int ReconnectIntervalMs = 3000; // 每次重连间隔3秒
private string _brokerAddr = "你的broker地址";
private string _clientId = "你的客户端ID";

// 初始化客户端
public void InitMqttClient()
{
    _client = new MqttClient(_brokerAddr);
    // 注册连接关闭事件
    _client.ConnectionClosed += MqttClient_ConnectionClosed;
    
    // 首次连接也做重试
    TryConnect();
}

// 连接逻辑封装
private bool TryConnect()
{
    try
    {
        // 这里填入你的连接参数:用户名、密码、遗嘱等
        byte returnCode = _client.Connect(_clientId);
        if (returnCode == MqttMsgConnack.CONN_ACCEPTED)
        {
            // 连接成功后重新订阅之前的主题
            _client.Subscribe(new string[] { "你的主题" }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE });
            return true;
        }
        return false;
    }
    catch
    {
        return false;
    }
}

// 连接断开事件回调
private void MqttClient_ConnectionClosed(object sender, EventArgs e)
{
    if (_isReconnecting) return;
    _isReconnecting = true;
    
    // 启动后台线程重连,避免阻塞事件线程
    new Thread(() =>
    {
        bool connected = false;
        while (!connected)
        {
            connected = TryConnect();
            if (!connected)
            {
                Thread.Sleep(ReconnectIntervalMs);
            }
        }
        _isReconnecting = false;
    }).Start();
}

注意事项

  • 重连成功后需要重新订阅所有之前订阅过的主题,MQTT broker默认不会保存非持久会话的订阅关系,如果你的客户端用的是临时会话(Connect方法的cleanSession参数设为true),重连后必须手动重新订阅
  • 可以根据实际需求调整重连间隔,比如增加退避策略(连续重连失败时逐步拉长间隔),减少broker的压力
  • 要加重连锁避免同一时间触发多个重连线程

内容的提问来源于stack exchange,提问作者luci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:57:03