es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mosquitto.h no define los contenidos de “struct mosquitto”.

Según entiendo, cuando un cliente se conecta, debo verificar que la sesión sea persistente y, si no lo es, realizar una suscripción a los temas de interés. Estoy utilizando Mosquitto versión 1.5.

No encontré una forma de verificar esta propiedad mediante llamadas a la API, pero descubrí que hay un campo booleano clean_session en la estructura struct mosquitto. Sin embargo, cuando intento acceder de esta manera:

void my_connect_callback(struct mosquitto *mosq, void *userdata, int result)
{
    log("Conectado, persistencia de sesión",(int)(mosq->clean_session));
}

Obtengo el error “dereferenciando el puntero a un tipo incompleto”. Esto parece normal ya que mosquitto.h NO tiene la definición de los campos dentro de la estructura struct mosquitto. El archivo llamado mosquitto_internal.h sí lo tiene, pero parece que no está diseñado para ser incluido en el proyecto de la aplicación.

¿Qué está mal aquí?

Actualización (después del comentario de @hardillb): (1) No encontré documentación que diga que clean_session en la estructura Mosquitto es el mismo que paso a mosquitto_new; (2) La documentación aquí dice:

El mensaje CONNACK contiene dos entradas de datos:

  • La bandera de sesión presente
  • Un código de retorno de conexión

Y es lógico que “bandera de sesión presente” estaría en algún lugar de los datos de retorno de la función de conexión o en la propia estructura Mosquitto. Por lo tanto, supuse que clean_session en la estructura es el valor devuelto por la función de conexión. A continuación, la misma fuente dice:

La bandera de sesión presente indica al cliente si el broker ya
tiene disponible una sesión persistente de interacciones previas con el
cliente. Cuando un cliente se conecta con Clean Session establecido en
verdadero, la bandera de sesión presente siempre es falsa porque no hay
sesión disponible. Si un cliente se conecta con Clean Session establecido en
falso, hay dos posibilidades: si hay información de sesión disponible para el
clientId y el broker ha almacenado información de sesión, la bandera de sesión presente es verdadera.

¿Dónde está esta bandera session_present para que la aplicación sepa que la conexión actual es una continuación de la anterior y no vuelva a suscribirse a los mismos temas?

Tags:  

Answer

  1. Avatar for davy.ai

    Parece que la bandera session_present no es accesible directamente a través de la estructura mosquitto o las llamadas de API. Según la documentación que proporcionó, esta bandera está incluida en el mensaje CONNACK enviado por el broker al establecer la conexión.

    Una forma de acceder a esta bandera es implementar la función de devolución de llamada on_connect(), que es llamada por la biblioteca cuando el cliente se ha conectado correctamente al broker. Esta función de devolución de llamada puede recibir la bandera session_present como parámetro:

    void my_connect_callback(struct mosquitto *mosq, void *userdata, int result, int session_present)
    {
        if(session_present){
            // El broker ya tiene una sesión persistente para este ID de cliente
        } else {
            // La sesión del cliente es nueva, se necesitan las suscripciones necesarias
        }
    }
    

    Puede registrar esta función de devolución de llamada con la función mosquitto_connect_callback_set() antes de establecer la conexión.

    Tenga en cuenta que esta bandera se aplica solo a sesiones no limpias (donde la bandera clean_session se establece en falso). Si clean_session se establece en verdadero, como en una nueva conexión, la bandera siempre es falsa.

Comments are closed.