异步 mosquitto 客户端尝试重新连接 mosquitto 代理

Async mosquitto client trying to re-connect with mosquitto broker

尝试实现基于 mosquitto MQTT 代理的异步客户端,运行永远在后台运行。我的目的是创建一个能够连接/重新连接到代理的客户端,以防代理在某个时间离线。我希望所有连接/重新连接逻辑都由 mosquitto 回调(事件驱动)管理。但是,此代码不会尝试连接到代理,以防您在代理最初停止(离线)时尝试 运行 客户端:

struct mosquitto *broker;
char ip[INET_ADDRSTRLEN]; // broker ip address
int port; // 1883
int keepalive; // 60
bool running = true;


int main(void)
{
    mosquitto_lib_init();
    broker = mosquitto_new(NULL, true, NULL);

    mosquitto_connect_callback_set(broker, on_connect_callback);
    mosquitto_disconnect_callback_set(broker, on_disconnect_callback);
    mosquitto_message_callback_set(broker, on_message_callback);

    mosquitto_connect_async(broker, ip, port, keepalive);
    mosquitto_loop_start(broker);


    while(running) {
        pause();
    }
}

经过一些测试,替换

mosquitto_connect_async(broker, ip, port, keepalive);

通过 while 循环轮询 mosquitto_connect_async 函数返回的第一个成功:

bool connected_to_broker = false;
while (!connected_to_broker) {
    rc = mosquitto_connect_async(broker, ip, port, keepalive);
    if (rc == MOSQ_ERR_SUCCESS) {
        connected_to_broker = true;
    } else {
        sleep(retry_timeout);
    }
}

经过while循环,貌似所有的源码都可以基于mosquitto回调

这是处理这种情况的预期方式吗?还是应该以不同的方式进行管理?谢谢!

您不必进行多次连接尝试。您的问题是第一次尝试因同样的原因失败但尚未触发任何回调,因为通信线程尚未启动。

如果您检查 mosquitto_connect_async 的 return 值,您会看到它是 MOSQ_ERR_ERRNOerrno 设置为 ECONNREFUSED (111)。

如果在您第一次尝试连接之前调用了 mosquitto_loop_start,则应触发断开连接回调 - rc == MOSQ_ERR_ERRNOerrno == ECONNREFUSED

也是如此