使用gdbus调试DBus
16 Jul 2014DBus是一个低延迟、低开销、高可用的IPC机制。 经过不断的发展,DBus已经成为主流的IPC机制,并且逐渐被应用到嵌入式系统,被Android、MeeGo、Tizen等移动操作系统所采用。 DBus设计了一套面向对象的API,所有的Services的Object函数都以Methond、Signal、Properties的概念对外展现,配合Introspectable API,第三方可以很容易的使用DBus。
Ubuntu 14.04
以connman为例
DBus的启动
如果DBus和connman没有安装,则使用sudo apt-get
安装。
dbus-daemon是一个后台进程,负责消息的转发,在系统启动时通过dbus-launch自动启动。如果需要手动运行,可以查看man dbus-daemon
。
一般来说,系统中会有两个dbus-daemon进程,一个属于system bus,一个属于session bus。
session bus处理同一用户启动和运行的不同程序之间的通信。system bus处理不同session bus下程序之间的通信。
一般来说连接system通道是没有问题的,但是连接session通道可能会出点小问题。
dbus-monitor可以监测session bus上的消息,我们也可以使用dbus-monitor来确定session是否可用。
运行dbus-monitor,如果没有错误输出,则表明session bus可用。
如果报Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
的错误,则需在profile中添加export DISPLAY=:0
配置并重启。
如果重启之后还不行,那么就需要配置DBUS_SESSION_BUS_ADDRESS
环境变量了。
有两种方法可以获取DBUS_SESSION_BUS_ADDRESS
要填写的值:
- 在~/.dbus/session-bus/目录下有文件保存已经建好的session bus信息
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-71yAWPQ98j,guid=f12e562709bef04dbeef54ee53c4c720
DBUS_SESSION_BUS_PID=4528
DBUS_SESSION_BUS_WINDOWID=71303169
- 运行dbus-launch
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-vBaMOLC5f4,guid=c581607d72d266f920297a2753c5e98a
DBUS_SESSION_BUS_PID=10547
获取到值后再执行export DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-71yAWPQ98j,guid=f12e562709bef04dbeef54ee53c4c720
gdbus的使用
** 获取connman的services **
gdbus call --system --dest net.connman --object-path / --method net.connman.Manager.GetServices
([(objectpath '/net/connman/service/ethernet_080027078793_cable',
{'Type': <'ethernet'>,
'Security': <@as []>,
'State': <'online'>,
'Favorite': <true>,
'Immutable': <false>,
'AutoConnect': <true>,
'Name': <'Wired'>,
'Ethernet': <{'Method': <'auto'>,
'Interface': <'eth0'>, 'Address': <'08:00:27:07:87:93'>, 'MTU': <uint16 1500>}>,
'IPv4': <{'Method': <'dhcp'>, 'Address': <'10.0.2.15'>, 'Netmask': <'255.255.255.0'>, 'Gateway': <'10.0.2.2'>}>,
'IPv4.Configuration': <{'Method': <'dhcp'>}>,
'IPv6': <@a{sv} {}>, 'IPv6.Configuration': <{'Method': <'auto'>,
'Privacy': <'prefered'>}>,
'Nameservers': <['8.8.8.8', '192.168.0.12', '10.10.0.13', '10.10.0.12']>,
'Nameservers.Configuration': <@as []>,
'Timeservers': <['10.0.2.2']>,
'Timeservers.Configuration': <@as []>,
'Domains': <['combatelecom.com']>,
'Domains.Configuration': <@as []>,
'Proxy': <{'Method': <'direct'>}>,
'Proxy.Configuration': <@a{sv} {}>,
'Provider': <@a{sv} {}>}
)