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

主要代碼實(shí)現(xiàn)
(1)線程主體
// 自動(dòng)重連主體
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);
}
// 如果還沒(méi)連接不符合結(jié)束條件則睡2秒
if (!_MqttClient.IsConnected)
{
Thread.Sleep(2000);
}
}
}));
retryThread.Start();
}
(2)實(shí)例化部分
// 實(shí)例化客戶端
private void _BuildClient()
{
try
{
_MqttClient = new MqttClient(_MqttServer);
}
catch (Exception e)
{
Debug.WriteLine("build client error:" + e.Message);
return;
}
// 消息到達(dá)事件綁定
_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 });
}
}
實(shí)測(cè)效果不錯(cuò),其中延時(shí)時(shí)間可以適當(dāng)調(diào)整。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)塊狀鏈表的項(xiàng)目實(shí)踐
這篇文章主要介紹了C#實(shí)現(xiàn)塊狀鏈表的項(xiàng)目實(shí)踐,通過(guò)定義塊和鏈表類,利用塊內(nèi)元素引用實(shí)現(xiàn)塊與塊之間的鏈接關(guān)系,從而實(shí)現(xiàn)對(duì)塊狀鏈表的遍歷、插入和刪除等操作,感興趣的可以了解一下2023-11-11
WPF程序?qū)⒖丶尸F(xiàn)的內(nèi)容保存成圖像
這篇文章介紹了WPF程序?qū)⒖丶尸F(xiàn)的內(nèi)容保存成圖像的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06

