python调用linux D-Bus

什么是D-Bus

 D-BUS 设计用于桌面应用程序和 OS 通信。D-Bus(其中D原先是代表桌面“Desktop” 的意思),即:用于桌面操作系统的通信总线。现在逐渐被引入到嵌入式系统中,不过名字还是保留原先的叫法而已。

典型的桌面都会有多个应用程序在运行,而且,它们经常需要彼此进行通信。DCOP 是一个用于 KDE 的解决方案,但是它依赖于 Qt,所以不能用于其他桌面环境之中。 类似的,Bonobo 是一个用于 GNOME 的解决方案,但是非常笨重,因为它是基于 CORBA 的。它还依赖于 GObject,所以也不能用于 GNOME 之外。 D-BUS 的目标是将 DCOP Bonobo 替换为简单的 IPC,并集成这两种桌面环境。 由于尽可能地减少了 D-BUS 所需的依赖,所以其他可能会使用 D-BUS 的应用程序不用担心引入过多依赖。 相对于其它的IPC, D-Bus丢掉了一些不必要的、复杂的东西,也正是因为这个原因,D-Bus比较快、简单。 D-Bus不和低层的IPC直接竞争,比如sockets, shared memory or message queues.这些低层点的IPC有它们自己的特点,和D-Bus并不冲突。

D-Bus是低延迟而且低开销的,设计得小而高效,以便最小化传送的往返时间。另外,协议是二进制的,而不是文本的,这样就排除了费时的序列化过程。 从开发者的角度来看,D-BUS 是易于使用的。有线协议容易理解,客户机程序库以直观的方式对其进行包装。

 

D-BUS中的系统总线和会话总线

一个持久的系统总线(system bus

它在引导时就会启动。这个总线由操作系统和后台进程使用,安全性非常好,以使得任意的应用程序不能欺骗系统事件。 它是桌面会话和操作系统的通信,这里操作系统一般而言包括内核和系统守护进程。 这种通道的最常用的方面就是发送系统消息,比如:插入一个新的存储设备;有新的网络连接;等等。

还将有很多会话总线(session buses

这些总线当用户登录后启动,属于那个用户私有。它是用户的应用程序用来通信的一个会话总线。 同一个桌面会话中两个桌面应用程序的通信,可使得桌面会话作为整体集成在一起以解决进程生命周期的相关问题。 这在GNOMEKDE桌面中大量使用。

综上原因,如果你准备在不同的进程之间传递大量的 数据,D-Bus可能不是最有效的方法,最有效的方法是使用共享内存,但是对共享内存的管理也是相当复杂的。

在我们的操作系统中可以安装D-Feet工具来调试dbus接口。

apt install d-feet

在启动栏中打开d-feet可以看到:System Bus Session Bus

 

 

D-Bus自动化测试

 

方法一:

python3 自带了dbus包,所以我们直接应用,例子:

import dbus
session_bus = dbus.SessionBus()

proxy = session_bus.get_object('com.deepin.filemanager.daemon', '/com/deepin/filemanager')  

proxy_dev = dbus.Interface(proxy, dbus_interface='org.freedesktop.DBus.Introspectable')

方法二:

使用第三方pydbus,先安装

pip3 install pydbus

例子:获取授权状态

from pydbus import SystemBus

bus = SystemBus()

proxy = bus.get(bus_name='com.deepin.license', object_path='/com/deepin/license/Info')

print(proxy.AuthorizationState)

 

我采用的是pydbus这个库,操作简单。

dbus-python这个库使用途中获取不到属性了,还没有仔细研究。这个问题解决: https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-properties

 

import dbus

bus = dbus.SystemBus()

proxy = bus.get_object(bus_name='com.deepin.license', object_path='/com/deepin/license/Info')
_iface = dbus.Interface(proxy, dbus.PROPERTIES_IFACE)
s1 = _iface.Get('com.deepin.license.Info', 'AuthorizationState')

print(s1)

 

这个方法是真的不好用

 

官网

https://github.com/freedesktop/dbus-python

https://pydbus.readthedocs.io/en/latest/installation.html

 

 

我们使用的时候可以结合D-Feet

 

posted @ 2022-05-23 16:40  Tarzen  阅读(412)  评论(0编辑  收藏  举报