【问题标题】:Paho C++ async client callbacks vs action_listener vs connected_handlerPaho C++ 异步客户端回调 vs action_listener vs connected_handler
【发布时间】:2020-03-30 03:33:34
【问题描述】:

我正在尝试了解使用 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 如果不能保证回调已经被调用,那它有什么意义呢?我很可能误解了某些东西,但我想指出正确的方向!

【问题讨论】:

    标签: c++ mqtt paho pahocpp


    【解决方案1】:

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

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

    解决办法是:

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

    【讨论】:

      猜你喜欢
      • 2017-08-19
      • 2015-08-12
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 2010-10-15
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多