#mosquitto #libmosquitto
#mosquitto #libmosquitto
Вопрос:
Насколько я понял, когда клиент подключается, я должен проверить, является ли сеанс постоянным, и, если это не так, выполнить подписку на интересующие темы. Я использую Mosquitto версии 1.5.
Я не нашел способа проверить это свойство с помощью вызовов API, но обнаружил, что в нем есть clean_session
логическое поле struct mosquitto
. Но когда я пытаюсь получить к нему доступ таким образом:
void my_connect_callback(struct mosquitto *mosq, void *userdata, int result)
{
log("Connected, session persistency",(int)(mosq->clean_session));
Я получаю ошибку разыменования указателя на неполный тип. Это кажется нормальным, как mosquitto.h
только НЕ имеет определения полей внутри struct mosquitto
. Вызываемый файл mosquitto_internal.h
имеет его, но, похоже, он не предназначен для включения в проект приложения.
Что здесь не так?
Обновление (после комментария @hardillb): (1) Я не нашел документации, в которой говорится, что clean_session
в структуре mosquitto это то же самое, к чему я перехожу mosquitto_new
; (2) в документации здесь говорится
Сообщение CONNACK содержит две записи данных:
- Флаг присутствия сеанса
- Код возврата соединения
И логично, что «флаг присутствия сеанса» будет где-то в данных обратного вызова connect или в самой структуре mosquitto. Поэтому я предположил, что clean_session
в структуре есть значение, возвращаемое функцией connect. Далее, в том же источнике говорится:
Флаг session present сообщает клиенту, есть ли у брокера уже постоянный сеанс, доступный из предыдущих взаимодействий с клиентом. Когда клиент подключается с чистым сеансом, для которого установлено значение true, флаг session present всегда false, поскольку сеанс недоступен. Если клиент подключается с чистым сеансом, для которого установлено значение false, есть две возможности: если информация о сеансе доступна для идентификатора клиента. и брокер сохранил информацию о сеансе, флаг session present имеет значение true.
Где этот session_present
флаг — чтобы приложение знало, что текущее соединение является продолжением предыдущего, и не подписывается повторно на те же темы?
Комментарии:
1. Какую проблему вы на самом деле пытаетесь здесь решить? он
mosq->clean_session
всегда будет хранить значениеclean_session
значения, которое вы ему передалиmosquitto_new
, и не изменится в зависимости от любого ответа от брокера.
Ответ №1:
Глядя на исходный код, это подразумевает, что вы должны использовать mosquitto_connect_with_flags_callback_set()
, а не mosquitto_connect_callback_set()
И передает указатель на функцию обратного вызова, который принимает дополнительное int
поле в конце аргументов.
Поле int будет содержать флаги CONNACK (которые в основном будут равны 0 или 1)
Похоже, что этот обратный вызов отсутствует на справочной странице.
Комментарии:
1. Лучший документ здесь mosquitto.org/api/files/mosquitto-h.html