Как использовать libmosquitto для отправки запроса и получения ответа с помощью MQTT v5?

#c #mqtt #mosquitto #libmosquitto

Вопрос:

Я пытаюсь использовать libmosquitto, чтобы сделать запрос (опубликовать в 'test/topic' теме), и я хочу получить ответ на основе идентификатора клиента (отправителя). Таким образом, это означает, что клиент опубликует 'test/topic' , и он автоматически подпишется 'test/topic/<client_id>'

Сервер уже зарегистрировался 'test/topic' , и когда он станет сообщением , он отправит ответ (опубликует) 'test/topic/<client_id>' , на который клиент подписался, чтобы получить этот ответ в первую очередь.

Проблема здесь в том , как мне получить <client_id> , правильно. Я уже сделал это в python и js, где клиент будет отправлять метаданные или свойства в полезной нагрузке, которые сервер может распаковать, чтобы получить идентификатор клиента. Однако сейчас я использую C , и это расстраивает, потому что я не могу понять, как получить эти свойства.

Вот пример того, как это сделать в python. Я просто хочу сделать то же самое с c

Я использую libmosquitto, как я уже упоминал. У меня даже нет примера, чтобы показать, потому что я не нашел, как это сделать. Буквально нет примера того, как это сделать с помощью библиотеки mosquitto c (что сбивает с толку, поскольку mosquitto, я думаю, известная библиотека).

Я надеюсь, что у кого-то была аналогичная проблема или кто-то может опубликовать пример для c и mosquitto lib. Заранее спасибо.

Ответ №1:

Если вы сомневаетесь, посмотрите на тесты:

 const char *my_client_id = ...;
mosquitto_property *proplist = NULL;

mosquitto_property_add_string_pair(amp;proplist, MQTT_PROP_USER_PROPERTY, "client_id", my_client_id);
mosquitto_publish_v5(mosq, amp;sent_mid, "test/topic", strlen("message"), "message", 0, false, proplist);
mosquitto_property_free_all(amp;proplist);
 

Поскольку вы спросили в комментариях, вы можете получить эти свойства из опубликованных сообщений, сначала установив on_message обратный вызов с помощью mosquitto_message_v5_callback_set и реализовав его следующим образом:

 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, amp;client_id, false);
        if (client_id) {
            /* client_id contains a client id. */
    }
}
 

Комментарии:

1. спасибо за быстрый ответ и подсказку. Однако как мне получить идентификатор client_id для подписанного клиента? в этом-то и проблема. Когда я подписываюсь на тест/тему от другого клиента, мне нужно получить доступ к этому списку в методе on_message (). У вас есть какие-либо идеи, как это сделать со стороны подписчика, а не издателя?

2. В вашем вопросе говорится: «Я пытаюсь использовать libmosquitto, чтобы сделать запрос «, — вот что я ответил. Независимо от того, если вам нужно получить эти свойства на подписчике, я думаю, что это простой вопрос использования mosquitto_message_v5_callback_set и проверки props . Однако все это было очень ясно из документации.

3. Я не эксперт в C или C , поэтому я не могу разобраться в этом. Хорошо, в вашем примере показано, как добавить свойство (client_id) в сообщение перед его публикацией, что здорово и продвигает меня вперед. Итак, как теперь я могу прочитать это свойство на стороне подписчика и получить идентификатор клиента? это далеко не ясно в документах, для этого нет примера. Должен ли я получить доступ к нему, как к реквизиту->client_id? или как точно прочитать реквизит

4. См.раздел правка. Также знайте, что существует встроенное свойство для указания темы ответа, называемое MQTT_PROP_RESPONSE_TOPIC

5. твой пример не сработал. Я не получил никаких ошибок, но мой подписчик не получил опубликованного сообщения