【问题标题】:How to use libmosquitto to make a request and get response using MQTT v5?如何使用 libmosquitto 发出请求并使用 MQTT v5 获得响应?
【发布时间】:2021-08-06 12:22:34
【问题描述】:

我正在尝试使用libmosquitto 发出请求(发布到'test/topic' 主题),并且我想获得基于客户端(发件人)ID 的响应。这意味着客户端将发布到'test/topic',它会自动订阅'test/topic/<client_id>'

服务器已经订阅了'test/topic',当它成为消息时,它会向'test/topic/<client_id>'发送一个响应(发布),客户端首先订阅该响应以接收该响应。

这里的挑战是我如何获得<client_id>,对。我已经在 python 和 js 中完成了这项工作,客户端将在有效负载中发送元数据或属性,服务器可以将其解包以获取 client_id。但是,我现在正在使用 C++,这很令人沮丧,因为我不知道如何获得这些属性。

这是一个example 如何在 python 中执行此操作。我只想用 c++ 做同样的事情

正如我提到的,我正在使用 libmosquitto。我什至没有一个例子可以展示,因为我没有找到如何做到这一点。实际上没有关于如何使用 mosquitto c++ lib 执行此操作的示例(这令人困惑,因为我猜 mosquitto 是一个著名的 lib)。

我希望有人有类似的问题,或者可以发布 C++ 和 mosquitto lib 的示例。提前致谢。

【问题讨论】:

    标签: c++ mqtt mosquitto libmosquitto


    【解决方案1】:

    如有疑问,请查看tests

    const char *my_client_id = ...;
    mosquitto_property *proplist = NULL;
    
    mosquitto_property_add_string_pair(&proplist, MQTT_PROP_USER_PROPERTY, "client_id", my_client_id);
    mosquitto_publish_v5(mosq, &sent_mid, "test/topic", strlen("message"), "message", 0, false, proplist);
    mosquitto_property_free_all(&proplist);
    

    由于您在 cmets 中询问,您可以通过首先使用 mosquitto_message_v5_callback_set 设置 on_message 回调并像这样实现它来从已发布的消息中检索这些属性:

    void on_message(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message, const mosquitto_property *props) {
        std::string topic{message->topic};
        if (topic == "test/topic") {
            const char *client_id = nullptr;
            mosquitto_property_read_string_pair(props, MQTT_PROP_USER_PROPERTY, nullptr, &client_id, false);
            if (client_id) {
                /* client_id contains a client id. */
        }
    }
    

    【讨论】:

    • 感谢您的快速回答和提示。我如何在订阅的客户端上获取 client_id?那就是问题所在。当从另一个客户端订阅测试/主题时,我需要在 on_message() 方法中访问该 proplist。您知道如何从订阅者端而不是发布者端执行此操作吗?
    • 您的问题是“我正在尝试使用 libmosquitto 来提出请求”,这就是我的回答。无论如何,如果您需要在订阅者上接收这些属性,我认为使用mosquitto_message_v5_callback_set 并检查props 很简单。不过,这在文档中非常清楚。
    • 我不是 C 或 C++ 方面的专家,因此,我无法解决这个问题。好的,您的示例显示了如何在发布消息之前将属性 (client_id) 添加到消息中,这很好,让我前进。那么现在我如何才能在订阅者端读取该属性并获取 client_id?文档中是否还不清楚,没有示例。我应该像 props->client_id 一样访问它吗?或如何准确阅读道具
    • 深入研究后,我注意到我的 publish_v5 方法没有按预期工作。当我调用 publish_v5 时,我得到 10 作为返回类型。在 mosquitto.h 中搜索后,我注意到这被映射到一个错误代码:MOSQ_ERR_NOT_SUPPORTED。我认为这意味着不支持 mqtt v5,但是,在他们的网站和 repo 上,他们说 lib 已经支持 v5。我正在使用 2.0.11 版本,它应该与 mqtt v5 一起使用
    • 您必须在 mosquitto-client 上通过调用 mosquitto_int_option(mosq, MOSQ_OPT_PROTOCOL_VERSION, MQTT_PROTOCOL_V5); 之前启用 v5(最好是在创建后立即)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2017-09-13
    • 2017-05-16
    相关资源
    最近更新 更多