C#中Mqtt断线怎么自动重连
创始人
2024-12-22 11:40:37
0次

在通过 MqttClient 客户端连接之后,在服务端服务重启时,客户端如果没有重连机制,则无法再接收到订阅的消息。

使用的 Mqtt 组件为:M2Mqtt.Net.dll

一些特性发现

(1)如果提供的服务端地址是不可解析的,会引发异常无法实例化 MqttClient 对象。(2)Connect 无法连接时会引发异常,IsConnected 为 false。(3)服务端断开会触发客户端的 ConnectionClosed 事件,IsConnected 为 false。(4)重新 Connect 需要重新 Subscribe 订阅主题。(5)MqttClient.Subscribe 第一个参数为订阅主题数组,第二个为相应的 qosLevel,两个数组长度必须一致,否则会异常。

重连流程控制

主要代码实现

(1)线程主体

// 自动重连主体private void _TryContinueConnect(){  if (IsConnected) return;  Thread retryThread = new Thread(new ThreadStart(delegate  {    while (_MqttClient == null || !_MqttClient.IsConnected)    {      if (_ToClose) break;      if (_MqttClient == null)      {        _BuildClient();        Thread.Sleep(3000);        continue;      }      try      {        _TryCount++;        _Connect();       }      catch (Exception ce)      {        Debug.WriteLine("re connect exception:" + ce.Message);      }      // 如果还没连接不符合结束条件则睡2秒      if (!_MqttClient.IsConnected)      {        Thread.Sleep(2000);      }    }  }));        retryThread.Start();}

(2)实例化部分

// 实例化客户端private void _BuildClient(){  try  {    _MqttClient = new MqttClient(_MqttServer);  }  catch (Exception e)  {    Debug.WriteLine("build client error:" + e.Message);    return;  }  // 消息到达事件绑定  _MqttClient.MqttMsgPublishReceived += client_MqttMsgPublishReceived;  // 连接断开事件绑定  _MqttClient.ConnectionClosed += (sender, e) =>  {    if (!_ToClose)    {      // 尝试重连      _TryContinueConnect();    }  };}

(3)尝试连接部分

// 发起一次连接,连接成功则订阅相关主题 private void _Connect(){  if (String.IsNullOrEmpty(_MqttUsername))  {    var b = _MqttClient.Connect(_MqttClientId);  }  else  {    var b = _MqttClient.Connect(_MqttClientId, _MqttUsername, _MqttUserpass);  }   if (_MqttClient.IsConnected)  {    _MqttClient.Subscribe(new string[] { "topic1", "topic2" },      new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE });  }}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...