我使用 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;
}
}
}