如何M2MQTT自动重新连接

时间:2017-04-21 15:59:39

标签: c# asp.net mqtt paho reconnect

我试图使用这个协议并且已经拥有2个客户端(一个用于发布,另一个用于订阅)和一个代理工作。

我的问题是我想在订阅客户端中实现重新连接功能,因为wifi信号不稳定并且不想每次都手动重启客户端,我该如何实现?

2 个答案:

答案 0 :(得分:4)

您可以使用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);
        }
    }

不完美,但会完成这项工作。

答案 1 :(得分:0)

对于那些寻求简单连接持久性的人来说,这是我使用的解决方案。

当您要启动mqtt连接时,请调用Task.Run(() => PersistConnectionAsync());,并注意static bool _tryReconnectMQTT应该在类(或所需)作用域级别上定义。

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事件,您可以订阅重新连接方法。