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.

El mensaje LWT llega en el momento equivocado (broker Mosquitto)

Hay un código en el cual publico y recibo mensajes desde el dispositivo. El problema es que si el dispositivo pierde la conexión repentinamente, el lwt llega solo 5 minutos después de que se haya cortado la conexión del dispositivo. El tiempo de vida es de 30 segundos.
test.py:

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Conectado con código de resultado "+str(rc))

client.subscribe("test/#")

def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))
    imei = msg.topic.split('test/')[1]
    data = msg.payload.decode()
    print(imei)
    print(data)
    publish(client, imei)

def publish(client, imei):
    topic = 'test/'+ imei
    client.publish(topic,'hello')
    print('ENVIADO')

client = mqtt.Client()
user = 'test'
passw = '1111'
client.username_pw_set(user,passw)
client.on_connect = on_connect
client.on_message = on_message
client.enable_bridge_mode()

client.connect("localhost", 1883, 30)

client.loop_forever()

mosquitto.conf:

persistence true
persistence_location /var/lib/mosquitto/

log_dest topic

log_type error
log_type warning
log_type notice
log_type information

connection_messages true
log_timestamp true

include_dir /etc/mosquitto/conf.d
max_keepalive 30

Así es como el cliente envía LWT:

modem_setWillMessage(0,0,topic,"no connect")

donde el primer 0 es qos, el segundo 0 es mensajes retenidos.

Simplemente no puedo encontrar la configuración que establezca el tiempo lwt a 60 segundos.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para configurar el tiempo del LWT (testamento en vida) en 60 segundos en el código dado, la función modem_setWillMessage() debe actualizarse con los parámetros qos, retain y will_delay. La función actualizada debería ser la siguiente:

    modem_setWillMessage(0, 0, topic, "no connect", qos=0, retain=False, will_delay=60)
    

    Aquí, qos es el nivel de calidad de servicio que determina la garantía de entrega del mensaje, retain es una bandera que determina si el mensaje será retenido por el broker o no, y will_delay es el tiempo en segundos después del cual se enviará el mensaje LWT en caso de que el dispositivo pierda la conexión.

    Al configurar el parámetro will_delay en 60, el mensaje LWT se enviará 60 segundos después de que el dispositivo pierda la conexión en lugar de los 5 minutos (300 segundos) predeterminados mencionados en el código.

Comments are closed.