M2MQTT如何自动重连
How to M2MQTT Auto Reconnect
我正在尝试使用此协议并且已经有 2 个客户端(一个用于发布,另一个用于订阅)和一个正在工作的代理。
我的问题是我想在订阅客户端中实现重新连接功能,因为wifi信号不稳定并且不想每次都手动重启客户端,我该如何实现?
您可以使用 ConnectionClosed 事件来检测何时发生断开连接。
然后我启动一个任务,尝试重新连接客户端。
类似于:
private async Task TryReconnectAsync(CancellationToken cancellationToken)
{
var connected = _client.IsConnected;
while (!connected && !cancellationToken.IsCancellationRequested)
{
try
{
_client.Connect(_clientId);
}
catch
{
_logger.Log(LogLevel.Warn, "No connection to...{0}",_serverIp);
}
connected = _client.IsConnected;
await Task.Delay(10000, cancellationToken);
}
}
不完美,但可以胜任。
对于那些寻求简单连接持久性的人,这里是我使用的解决方案。
当您想启动 mqtt 连接调用时 Task.Run(() => PersistConnectionAsync());
并注意 static bool _tryReconnectMQTT
应该定义在 class(或所需的)范围级别。
private async Task PersistConnectionAsync()
{
var connected = _mqttClient.IsConnected;
while (_tryReconnectMQTT)
{
if (!connected)
{
try
{
_mqttClient.Connect(_clientId);
}
catch
{
Debug.WriteLine("failed reconnect");
}
}
await Task.Delay(1000);
connected = _mqttClient.IsConnected;
}
}
我还建议使用最后的遗嘱来了解您的客户停工的时间和时间。将 _mqttClient.Connect(_clientId);
替换为以下内容。
_mqttClient.Connect(_clientId,
null, null,
false,
MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, //aws
true,
$"/my/topic/{_clientId}connectionstatus",
"{\"message\":\"disconnected\"}",
true,
60);
在连接语句后发布一条连接消息到相同主题和类似消息,以确保您知道所有断开连接的时间。使用 AWS 规则引擎,您将能够发送有关连接状态的通知,甚至可以在重新连接之间的持续时间超过特定时间时通知自己。
m2mqtt 客户端有一个 .ConnectionClosed
事件,您可以订阅您的重新连接方法。
我正在尝试使用此协议并且已经有 2 个客户端(一个用于发布,另一个用于订阅)和一个正在工作的代理。
我的问题是我想在订阅客户端中实现重新连接功能,因为wifi信号不稳定并且不想每次都手动重启客户端,我该如何实现?
您可以使用 ConnectionClosed 事件来检测何时发生断开连接。
然后我启动一个任务,尝试重新连接客户端。 类似于:
private async Task TryReconnectAsync(CancellationToken cancellationToken)
{
var connected = _client.IsConnected;
while (!connected && !cancellationToken.IsCancellationRequested)
{
try
{
_client.Connect(_clientId);
}
catch
{
_logger.Log(LogLevel.Warn, "No connection to...{0}",_serverIp);
}
connected = _client.IsConnected;
await Task.Delay(10000, cancellationToken);
}
}
不完美,但可以胜任。
对于那些寻求简单连接持久性的人,这里是我使用的解决方案。
当您想启动 mqtt 连接调用时 Task.Run(() => PersistConnectionAsync());
并注意 static bool _tryReconnectMQTT
应该定义在 class(或所需的)范围级别。
private async Task PersistConnectionAsync()
{
var connected = _mqttClient.IsConnected;
while (_tryReconnectMQTT)
{
if (!connected)
{
try
{
_mqttClient.Connect(_clientId);
}
catch
{
Debug.WriteLine("failed reconnect");
}
}
await Task.Delay(1000);
connected = _mqttClient.IsConnected;
}
}
我还建议使用最后的遗嘱来了解您的客户停工的时间和时间。将 _mqttClient.Connect(_clientId);
替换为以下内容。
_mqttClient.Connect(_clientId,
null, null,
false,
MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, //aws
true,
$"/my/topic/{_clientId}connectionstatus",
"{\"message\":\"disconnected\"}",
true,
60);
在连接语句后发布一条连接消息到相同主题和类似消息,以确保您知道所有断开连接的时间。使用 AWS 规则引擎,您将能够发送有关连接状态的通知,甚至可以在重新连接之间的持续时间超过特定时间时通知自己。
m2mqtt 客户端有一个 .ConnectionClosed
事件,您可以订阅您的重新连接方法。