0

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

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

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

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

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

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

4

1 回答 1

1

如有疑问,请查看测试

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);

由于您在评论中询问,您可以通过首先使用mosquitto_message_v5_callback_seton_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. */
    }
}
于 2021-08-06T13:01:34.343 回答