使用 MQTTv5 连接时,Mosquitto 在第一次连接失败后不会自动重新连接

问题描述 投票:0回答:1

我使用 Mosquitto 版本 2.0.18 进行 MQTT 连接。使用 MQTTv5 时,如果初始连接尝试失败,Mosquitto 不会自动尝试重新连接。初始化代码如下:

char sn[64] = {0};
mqtt_prop_sn_get(NULL, sn, sizeof(sn));
g_mosq = mosquitto_new(sn, session, NULL);
if (!g_mosq)
{
    MOCAR_LOG_ERROR("create client fail");
    return -1;
}
mosquitto_int_option(g_mosq, MOSQ_OPT_PROTOCOL_VERSION, MQTT_PROTOCOL_V5);
int loop = mosquitto_loop_start(g_mosq);
if (loop != MOSQ_ERR_SUCCESS)
{
    MOCAR_LOG_ERROR_FMT("mosquitto loop error");
    huali_plf_mqtt_cleanup();
    return -1;
}
mosquitto_username_pw_set(mosq, g_mqtt_info.user_id, g_mqtt_info.password);
mosquitto_connect_v5_callback_set(mosq, my_connect_v5_callback);
mosquitto_message_v5_callback_set(mosq, my_message_v5_callback);
mosquitto_subscribe_v5_callback_set(mosq, my_subscribe_v5_callback);
mosquitto_disconnect_v5_callback_set(mosq, my_disconnect_v5_callback);
mosquitto_reconnect_delay_set(mosq, 5, 15, true);

while (1)
{
    ret = mosquitto_connect_async(g_mosq, mqtt_info.address, mqtt_info.port, KEEP_ALIVE);
    if (MOSQ_ERR_SUCCESS == ret)
    {
        MOCAR_LOG_DEBUG_FMT("mosquitto_connect_async success");
        break;
    }
    else if (MOSQ_ERR_INVAL == ret)
    {
        MOCAR_LOG_DEBUG_FMT("the input parameters were invalid");
        break;
    }
    else
    {
        MOCAR_LOG_DEBUG_FMT("mqtt connect failed: %s", strerror(errno));
        sleep(3);
        continue;
    }
}

后来我尝试使用定时器每隔30秒手动重新连接一次,成功重新建立连接。然而,每次调用

mosquitto_loop_start
都会导致 8MB 内存泄漏问题。这是我的重新连接代码:

void mqtt_check_reconnect(void)
{
    if (1 != cv2x_plf_mqtt_get_send_flag())
    {
        int rc = 0;
        mosquitto_disconnect(g_mosq);
        mosquitto_loop_stop(g_mosq, true);
        sleep(1);
        mosquitto_username_pw_set(g_mosq, g_mqtt_info.user_id, g_mqtt_info.password);
        cv2x_plf_mqtt_connect_handle();
        rc = mosquitto_loop_start(g_mosq);
        if (rc)
        {
            MOCAR_LOG_ERROR_FMT("mosquitto_loop_start failed, rc is %s", mosquitto_strerror(rc));
            return;
        }
    }
}
mqtt mosquitto reconnect libmosquitto
1个回答
0
投票

问题已经确定。在mosquitto__thread_main函数中,将mosq->threaded的值设置为mosq_ts_none,这直接导致mosquitto_loop_stop返回,因为mosq->threaded != mosq_ts_self,并且不执行线程相关的操作。 enter image description hereenter image description hereenter image description here 要修改 Mosquitto 源代码,您可以注释掉将 mosq->threaded 设置为 mosq_ts_none 的行,如下所示: enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.