Skip to content

Commit 64865a6

Browse files
committed
bugs fixed: reconnect on mqtt server disconnect, when computer comes from sleep or broker unexpectedly drops the connection
1 parent 6374be8 commit 64865a6

1 file changed

Lines changed: 54 additions & 25 deletions

File tree

Src/Client/Services/MqttService.cs

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,51 +21,80 @@ class MqttService
2121
private MqttClient client;
2222
private Thread mqttThread;
2323

24+
private void Connect(MqttClient client)
25+
{
26+
while (!client.IsConnected)
27+
{
28+
if (!Settings.MqttServiceRunning)
29+
break;
30+
try
31+
{
32+
// Attempt to connect
33+
var clientId = Guid.NewGuid().ToString();
34+
if (Settings.MqttSettings.ClientID != "")
35+
clientId = Settings.MqttSettings.ClientID;
36+
client.Connect(clientId, Settings.MqttSettings.Username, Settings.MqttSettings.Password);
37+
// If connected successfully, subscribe to topics, publish messages, etc.
38+
if (client.IsConnected)
39+
{
40+
Logger.WriteLog("Connected to MQTT server at: {0}:{1}", Settings.MqttSettings.Server, Settings.MqttSettings.Port);
41+
foreach (MqttRulesDefinition rule in Settings.MqttRulesSettings)
42+
{
43+
if (rule != null && rule.Topic != "")
44+
{
45+
Logger.WriteLog("MQTT Subscribing to topic: {0}", rule.Topic);
46+
client.Subscribe(new string[] { rule.Topic },
47+
new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
48+
}
49+
}
50+
}
51+
}
52+
catch (Exception ex)
53+
{
54+
// Handle connection error
55+
Logger.WriteLog("Unable to connect to MQTT server at: {0}:{1} error: {2}", Settings.MqttSettings.Server, Settings.MqttSettings.Port, ex.Message);
56+
}
57+
58+
59+
60+
// If connection failed, wait for a while before attempting to reconnect
61+
if (!client.IsConnected)
62+
{
63+
Thread.Sleep(5000); // Wait for 5 seconds before retrying
64+
Logger.WriteLog("MQTT Not connected...");
65+
}
66+
}
67+
}
68+
2469
private void ServiceStart()
2570
{
2671
Logger.WriteLog("Mqtt service Thread is running...");
2772

2873

2974
client = new MqttClient(Settings.MqttSettings.Server, Settings.MqttSettings.Port, false, null, null, MqttSslProtocols.None);
30-
3175

3276
// register handler to a received message
3377
client.MqttMsgPublishReceived += MqttMsgPublishReceived;
3478
client.ConnectionClosed += OnDisconnect;
35-
36-
var clientId = Guid.NewGuid().ToString();
37-
if (Settings.MqttSettings.ClientID != "")
38-
clientId = Settings.MqttSettings.ClientID;
39-
try
40-
{
41-
client.Connect(Settings.MqttSettings.ClientID,Settings.MqttSettings.Username,Settings.MqttSettings.Password);
42-
}
43-
catch (Exception ex)
44-
{
45-
Logger.WriteLog("Unable to connect to MQTT server at: {0}:{1} error: {2}", Settings.MqttSettings.Server, Settings.MqttSettings.Port,ex.Message);
46-
}
47-
Settings.MqttServiceRunning = true;
4879

49-
if (client.IsConnected)
50-
{
51-
Logger.WriteLog("Connected to MQTT server at: {0}:{1}", Settings.MqttSettings.Server, Settings.MqttSettings.Port);
52-
foreach (MqttRulesDefinition rule in Settings.MqttRulesSettings)
53-
{
54-
if (rule != null && rule.Topic != "")
55-
client.Subscribe(new string[] { rule.Topic },
56-
new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
57-
}
58-
}
80+
Connect(client);
81+
82+
Settings.MqttServiceRunning = true;
5983

6084
while (mqttThread.ThreadState == ThreadState.Running)
6185
{
6286
Thread.Sleep(500);
6387
}
88+
Logger.WriteLog("MQTT Service finished work");
6489
}
6590

66-
private static void OnDisconnect(object sender, EventArgs e)
91+
private void OnDisconnect(object sender, EventArgs e)
6792
{
6893
Logger.WriteLog("MQTT Server disconnected...");
94+
// Attempt to reconnect
95+
MqttClient cl = (MqttClient)sender;
96+
if (cl != null)
97+
Connect(cl);
6998
}
7099

71100

0 commit comments

Comments
 (0)