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.

¿Cómo podemos detener una conexión de cliente desde el broker de Mosquitto?

Tengo varios dispositivos que envían mensajes a un mediador de mosquito. Me gustaría administrar una especie de revocación de dispositivos para que, cuando se revoque un dispositivo, el mediador de mosquito cierre automáticamente la conexión para este dispositivo específico.

¿Hay algún comando o forma de pedirle al mediador que cierre explícitamente una conexión con un cliente específico?

Gracias de antemano,
hak

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, existe una forma de cerrar una conexión para un dispositivo específico en el intermediario Mosquitto. El comando a utilizar es MQTT_CMD_DISCONNECT. Puedes suscribirte a un tema específico donde puedes publicar un mensaje con el ID del cliente del dispositivo que deseas revocar. Cuando el intermediario recibe este mensaje, enviará el comando MQTT_CMD_DISCONNECT al cliente especificado y cerrará su conexión.

    Aquí tienes un ejemplo de código Python que utiliza el cliente MQTT de Paho:

    import paho.mqtt.publish as publish
    
    # especifica el ID del dispositivo que deseas revocar
    device_id = "dispositivo1"
    
    # publica un mensaje en el tema "revoke_device" con el ID del dispositivo como carga útil
    publish.single("revoke_device", payload=device_id, hostname="mosquitto_broker")
    
    

    En el lado del intermediario, puedes crear un nuevo plugin para manejar el tema revoke_device y utilizar el comando MQTT_CMD_DISCONNECT para cerrar la conexión del cliente especificado. Por ejemplo, puedes implementar el plugin en Python utilizando las bibliotecas de Python de Mosquitto:

    import mosquitto
    
    def on_message(mosq, obj, msg):
        # extrae el ID del dispositivo de la carga útil del mensaje
        device_id = msg.payload
    
        # obtén el ID del cliente del dispositivo
        clients = mosq.get_clients_info()
        client_id = None
        for client in clients:
            if client['username'] == device_id:
                client_id = client['clientid']
                break
    
        # si se encuentra el ID del cliente, envía el comando MQTT_CMD_DISCONNECT
        if client_id:
            mosq.disconnect_client(client_id)
    
    # configura el intermediario Mosquitto con el plugin
    broker = mosquitto.Mosquitto("intermediario_con_plugin")
    broker.plugin_init("/ruta/al/plugin.so")
    broker.subscribe("revoke_device")
    broker.message_callback_add("revoke_device", on_message)
    broker.connect("localhost")
    
    # inicia el bucle del intermediario
    while True:
        broker.loop()
    

    Este plugin escuchará el tema revoke_device y llamará a la función on_message cuando se publique un mensaje en él. La función extraerá el ID del dispositivo de la carga útil del mensaje, buscará el ID del cliente del dispositivo en la lista de clientes del intermediario y llamará a la función disconnect_client para cerrar la conexión del dispositivo.

Comments are closed.