C# Mqtt 斷線重連的實現(xiàn)代碼
在通過 MqttClient 客戶端連接之后,在服務(wù)端服務(wù)重啟時,客戶端如果沒有重連機制,則無法再接收到訂閱的消息。
使用的 Mqtt 組件為:M2Mqtt.Net.dll
一些特性發(fā)現(xiàn)
(1)如果提供的服務(wù)端地址是不可解析的,會引發(fā)異常無法實例化 MqttClient 對象。
(2)Connect 無法連接時會引發(fā)異常,IsConnected 為 false。
(3)服務(wù)端斷開會觸發(fā)客戶端的 ConnectionClosed 事件,IsConnected 為 false。
(4)重新 Connect 需要重新 Subscribe 訂閱主題。
(5)MqttClient.Subscribe 第一個參數(shù)為訂閱主題數(shù)組,第二個為相應(yīng)的 qosLevel,兩個數(shù)組長度必須一致,否則會異常。
重連流程控制

主要代碼實現(xiàn)
(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);
}
// 如果還沒連接不符合結(jié)束條件則睡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)嘗試連接部分
// 發(fā)起一次連接,連接成功則訂閱相關(guān)主題
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 });
}
}
實測效果不錯,其中延時時間可以適當(dāng)調(diào)整。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
WPF程序?qū)⒖丶尸F(xiàn)的內(nèi)容保存成圖像
這篇文章介紹了WPF程序?qū)⒖丶尸F(xiàn)的內(nèi)容保存成圖像的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06

