Introdução ao D-Bus
-
O D-Bus fornece meios para comunicação entre serviços . Os serviços podem ser anônimos (identificados apenas pelo endereço do barramento, como: 1.6), e os serviços podem adquirir nomes conhecidos , como
org.freedesktop.Notifications
ouorg.freedesktop.NetworkManager
. O remetente e o destino que você pode ver nos logs são serviços. "Destino nulo" significa transmissão: entrega para todos os serviços. -
Um serviço pode exportar um ou vários objetos para o barramento. Os objetos recebem caminhos de objeto , como
/org/freedesktop/NetworkManager/ActiveConnection/1
ou/org/ayatana/menu/DA00003
. Caminhos de objetos usam barra como separador, como caminhos do sistema de arquivos. -
Cada objeto pode suportar uma ou várias interfaces . Uma interface nada mais é do que um conjunto de métodos e sinais, coloquialmente conhecidos como membros (muito semelhantes à interface OOP). Métodos e sinais possuem assinaturas fixas. Os membros são sempre namespaces em nomes de interfaces conhecidos .
-
Uma vez publicados, os nomes conhecidos nunca mudam .
-
Qualquer serviço pode se conectar aos sinais de outro serviço e chamar de forma assíncrona seus métodos. Qualquer serviço pode emitir sinais.
Sinais
Agora, para as suas perguntas específicas.
signal sender=:1.1948 -> dest=(null destination) serial=1829990 path=/org/ayatana/menu/DA00003; interface=org.ayatana.dbusmenu; member=ItemPropertyUpdated int32 23 string "enabled" variant boolean true
Sim, você está certo, isso é um sinal. Ele é transmitido pelo serviço :1.1948
e o objeto "auto" é /org/ayatana/menu/DA00003
. O sinal tem o nome ItemPropertyUpdated
, que é definido na interface org.ayatana.dbusmenu
(como org.ayatana.dbusmenu::ItemPropertyUpdated
em C ++). A série, eu acho, é uma espécie de identificador único do evento no ônibus.
Então vemos os argumentos de sinal. De acordo com a documentação da interface , o primeiro argumento int32 é o id de um item, a segunda string é seu nome de propriedade e a terceira variante é o valor da propriedade. Então, o objeto /org/ayatana/menu/DA00003
está nos notificando
que o item id # 23 alterou sua propriedade enabled
para true.
Outro exemplo de sinais:
signal sender=:1.1602 -> dest=(null destination) serial=20408 path=/im/pidgin/purple/PurpleObject; interface=im.pidgin.purple.PurpleInterface; member=SendingChatMsg int32 47893 string "test" uint32 1 signal sender=:1.1602 -> dest=(null destination) serial=20409 path=/im/pidgin/purple/PurpleObject; interface=im.pidgin.purple.PurpleInterface; member=IrcSendingText int32 64170 string "PRIVMSG #chat :test
Enviei uma mensagem de texto "test" usando o Pidgin para um canal de IRC, e /im/pidgin/purple/PurpleObject
emitiu dois sinais na interface im.pidgin.purple.PurpleInterface
: primeiro, um% geral_de_co%, depois um% deSendingChatMsg
mais específico.
Métodos
Agora métodos. Os métodos são uma maneira de fazer com que os objetos do D-Bus façam alguma coisa, ou para realizar alguma consulta e retornar dados. Eles são bastante semelhantes aos métodos OOP clássicos, exceto que os métodos D-Bus são chamados de forma assíncrona.
Vamos chamar um método D-Bus programaticamente.
import dbus, dbus.proxies
#-- connect to the session bus (as opposed to the system bus)
session = dbus.SessionBus()
#-- create proxy object of D-Bus object
obj_proxy = dbus.proxies.ProxyObject(conn=session,
bus_name="org.freedesktop.Notifications", #-- name of the service we are retrieving object from
object_path="/org/freedesktop/Notifications") #-- the object path
#-- create proxy object of the D-Bus object wrapped into specific interface
intf_proxy = dbus.proxies.Interface(obj_proxy, "org.freedesktop.Notifications")
#-- lastly, create proxy object of the D-Bus method
method_proxy = intf_proxy.get_dbus_method("Notify")
#-- ... and call the method
method_proxy("test from python",
dbus.UInt32(0),
"bluetooth", #-- icon name
"Notification summary",
"Here goes notification body",
[], {},
5) #-- timeout
Observe os argumentos, especialmente o nome do ícone. No seu exemplo, IrcSendingText
era o ícone do alto-falante de volume de média potência.
Serviços personalizados
É absolutamente possível executar seus próprios serviços D-Bus, exportar seus próprios objetos D-Bus e definir suas próprias interfaces D-Bus com seus próprios métodos e sinais. Tudo isso pode ser feito em Python muito facilmente, uma vez que você compreenda o conceito geral e leia a documentação do módulo "notification-audio-volume-medium"
. dbus