0

我试图了解使用 async_client 时 Paho MQTT C++ 库中各种回调机制的用法和行为,特别是:

  • mqtt::回调
  • mqtt::iaction 监听器
  • mqtt::connection_handler

我想要实现的目标:等待成功连接成功订阅主题列表(以单个主题开头)的阻塞初始化方法,以及在连接断开时自动重新连接重新订阅这些主题出去。

'async_subscribe' 示例(https://github.com/eclipse/paho.mqtt.cpp/blob/master/src/samples/async_subscribe.cpp)建议我应该订阅 mqtt::callback::connected 中的主题。但是,它没有显示如何等待订阅成功完成。我的理解是,我不应该在连接的回调中对订阅令牌调用“等待”。如果我设置了一个私有var _subscribeToken 等待,似乎无法保证在等待连接令牌完成后是否已设置,即(伪代码):

void Callback::connected(const std::string& cause){
    _subscribeToken = _client->subscribe(topic, qos, nullptr, action_listener);
}

在初始化:

token_ptr connectToken = connect(connectOpts);
connectToken->wait();

_subscribeToken->wait(); // but _subscribeToken may still be null at this point. 

如果它不能保证回调已经被调用,那么 connectToken->wait 有什么意义呢?我很可能误解了某些东西,但我想指出正确的方向!

4

1 回答 1

0

通过进一步深入研究 C++/C 库,我能够确定 Callback::connected 是Token::on_success 之后调用的(因此在等待已经完成之后)。

似乎该领域的文档和示例不是很好。我在 Github 项目中提出了一个问题:https ://github.com/eclipse/paho.mqtt.cpp/issues/256 。

解决方案是:

  • 从连接令牌的 on_success 回调调用 subscribe(首先确保 token_type == CONNECT)
  • 如果原因是“自动重新连接”,则在 Callback::connected 中,我将一条消息发回主线程,我们需要重新订阅主题。然后我可以从主线程处理重新连接(订阅并等待订阅令牌完成)。
于 2020-04-01T02:57:48.493 回答