En esta página

Qt D-Bus Visión general

D-Bus es un mecanismo de Comunicación entre Procesos (IPC) y Llamada a Procedimiento Remoto (RPC) originalmente desarrollado para Linux para reemplazar las soluciones IPC existentes y competidoras con un protocolo unificado. También se diseñó para permitir la comunicación entre procesos a nivel de sistema (como servicios de impresora y controladores de hardware) y procesos de usuario normales.

Utiliza un protocolo binario rápido de paso de mensajes, adecuado para la comunicación entre máquinas debido a su baja latencia y baja sobrecarga. Su especificación está actualmente definida por el proyecto freedesktop.org y está a disposición de todos los interesados.

En general, la comunicación se realiza a través de un servidor central llamado "bus" (de ahí su nombre), pero también es posible la comunicación directa entre aplicaciones. Cuando se comunican a través de un bus, las aplicaciones pueden consultar qué otras aplicaciones y servicios están disponibles, así como activar uno bajo demanda.

Los buses

Los buses D-Bus se utilizan cuando se desea una comunicación de muchos a muchos. Para ello, se lanza un servidor central antes de que cualquier aplicación pueda conectarse al bus. Este servidor es responsable de mantener un registro de las aplicaciones que se conectan y de encaminar correctamente los mensajes desde su origen hasta su destino.

Además, D-Bus define dos buses bien conocidos, denominados bus de sistema y bus de sesión. Estos buses son especiales en el sentido de que tienen una semántica bien definida: algunos servicios están definidos para encontrarse en uno de estos buses o en ambos.

Por ejemplo, una aplicación que desee consultar la lista de dispositivos de hardware conectados al ordenador probablemente se comunicará con un servicio disponible en el bus de sistema, mientras que el servicio que proporciona la apertura del navegador web del usuario probablemente se encontrará en el bus de sesión.

En el bus de sistema, también puedes esperar encontrar restricciones sobre qué servicios puede ofrecer cada aplicación. Por lo tanto, puedes estar razonablemente seguro de que si un determinado servicio está presente, está siendo ofrecido por una aplicación de confianza.

Conceptos

Mensajes

A bajo nivel, las aplicaciones se comunican a través de D-Bus enviándose mensajes entre ellas. Los mensajes se utilizan para transmitir las llamadas a procedimientos remotos, así como las respuestas y los errores asociados a ellas. Cuando se utilizan a través de un bus, los mensajes tienen un destino, lo que significa que se enrutan sólo a las partes interesadas, evitando la congestión debida al "enjambre" o difusión.

Sin embargo, un tipo especial de mensaje denominado "mensaje de señal" (concepto basado en el mecanismo de señales y ranuras de Qt) no tiene un destino predefinido. Dado que su propósito es ser utilizados en un contexto de uno a muchos, los mensajes de señal están diseñados para funcionar mediante un mecanismo de "opt-in".

El módulo Qt D-Bus encapsula completamente el concepto de bajo nivel de los mensajes en un enfoque más sencillo, orientado a objetos y familiar para los desarrolladores de Qt. En la mayoría de los casos, el desarrollador no necesita preocuparse de enviar o recibir mensajes.

Nombres de servicio

Cuando se comunican a través de un bus, las aplicaciones obtienen lo que se denomina un "nombre de servicio": es la forma en que esa aplicación elige ser conocida por otras aplicaciones en el mismo bus. Los nombres de servicio son intermediados por el demonio del bus D-Bus y se utilizan para encaminar mensajes de una aplicación a otra. Un concepto análogo a los nombres de servicio son las direcciones IP y los nombres de host: un ordenador tiene normalmente una dirección IP y puede tener asociados uno o más nombres de host, según los servicios que preste a la red.

Por otro lado, si no se utiliza un bus, tampoco se utilizan nombres de servicio. Si volvemos a comparar esto con una red informática, equivaldría a una red punto a punto: como se conoce al peer, no es necesario utilizar nombres de host para encontrarlo ni su dirección IP.

El formato de un nombre de servicio D-Bus es, de hecho, muy similar al de un nombre de host: es una secuencia separada por puntos de letras y dígitos. La práctica común es incluso nombrar el nombre de tu servicio de acuerdo con el nombre de dominio de la organización que definió ese servicio.

Por ejemplo, el servicio D-Bus está definido por freedesktop.org y puede encontrarse en el bus bajo el nombre de servicio:

org.freedesktop.DBus

Rutas de objetos

Al igual que los hosts de red, las aplicaciones proporcionan servicios específicos a otras aplicaciones mediante la exportación de objetos. Dichos objetos están organizados jerárquicamente, de forma muy similar a la relación padre-hijo que poseen las clases derivadas de QObject. Una diferencia, sin embargo, es que existe el concepto de "objeto raíz", que todos los objetos tienen como padre último.

Si continuamos nuestra analogía con los servicios web, las rutas de objetos equivalen a la parte de ruta de una URL:

Ruta en una URL.

Al igual que ellas, las rutas de objetos en D-Bus se forman de forma similar a los nombres de ruta en el sistema de archivos: son etiquetas separadas por barras, cada una de ellas compuesta por letras, dígitos y el carácter de subrayado ("_"). Siempre deben empezar con una barra y no deben terminar con ninguna.

Interfaces

Las interfaces son similares a las clases abstractas de C++ y a la palabra clave interface de Java, y declaran el "contrato" que se establece entre el que llama y el que recibe. Es decir, establecen los nombres de los métodos, señales y propiedades que están disponibles, así como el comportamiento que se espera de ambas partes cuando se establece la comunicación.

Qt utiliza un mecanismo muy similar en su sistema de plugins: Las clases base en C++ se asocian a un identificador único mediante la macro Q_DECLARE_INTERFACE().

Los nombres de las interfaces D-Bus son, de hecho, nombrados de una manera similar a la sugerida por el sistema de plugins de Qt: un identificador normalmente construido a partir del nombre de dominio de la entidad que definió esa interfaz.

Hoja de trucos

Para facilitar el recuerdo de los formatos de nomenclatura y sus propósitos, puede utilizarse la siguiente tabla:

D-Bus ConceptoAnalogíaFormato de nombre
Nombre de servicioNombres de host de redSeparado por puntos ("parece un nombre de host")
Ruta del objetoComponente de ruta URLSeparado por barras ("parece una ruta")
InterfazIdentificador de pluginSeparado por puntos

Depuración

Cuando se desarrollan aplicaciones que utilizan D-Bus, a veces es útil poder ver información sobre los mensajes que se envían y reciben a través del bus por cada aplicación.

Esta característica se puede habilitar para cada aplicación configurando la variable de entorno QDBUS_DEBUG antes de ejecutar cada aplicación. Por ejemplo, podemos habilitar la depuración sólo para el coche en el ejemplo del Coche teledirigido D-Bus ejecutando el controlador y el coche de la siguiente manera:

examples/dbus/remotecontrolledcar/controller/controller &
QDBUS_DEBUG=1 examples/dbus/remotecontrolledcar/car/car &

La información sobre los mensajes se escribirá en la consola desde la que se lanzó la aplicación.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.