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.
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ámetrosqos
,retain
ywill_delay
. La función actualizada debería ser la siguiente: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, ywill_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.