异步 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_ERRNO
,errno
设置为 ECONNREFUSED
(111)。
如果在您第一次尝试连接之前调用了 mosquitto_loop_start
,则应触发断开连接回调 - rc == MOSQ_ERR_ERRNO
和 errno == ECONNREFUSED
也是如此
尝试实现基于 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_ERRNO
,errno
设置为 ECONNREFUSED
(111)。
如果在您第一次尝试连接之前调用了 mosquitto_loop_start
,则应触发断开连接回调 - rc == MOSQ_ERR_ERRNO
和 errno == ECONNREFUSED