2.3.2、ListActivatableNames和服务器的自动启动
运行:
$ dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.ListActivatableNames
和
$ dbus-send --session --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.ListActivatableNames
返回的数据是一样的。在我的电脑上返回的数据是:
array [
string "org.freedesktop.DBus"
string "org.freedesktop.Notifications"
string "net.ekiga.helper"
string "org.freedesktop.PowerManagement"
string "org.freedesktop.Tracker"
string "org.freedesktop.SystemToolsBackends.GroupsConfig"
string "org.freedesktop.SystemToolsBackends.NTPConfig"
string "org.gnome.Tomboy"
string "org.freedesktop.SystemToolsBackends.HostsConfig"
string "org.freedesktop.SystemToolsBackends.NFSConfig"
string "org.freedesktop.SystemToolsBackends"
string "net.ekiga.instance"
string "org.gnome.GnomeVFS.Daemon"
string "com.redhat.dhcp"
string "org.freedesktop.SystemToolsBackends.TimeConfig"
string "org.freedesktop.SystemToolsBackends.IfacesConfig"
string "org.freedesktop.SystemToolsBackends.ServicesConfig"
string "org.gnome.Rhythmbox"
string "org.freedesktop.SystemToolsBackends.Platform"
string "org.freedesktop.SystemToolsBackends.UsersConfig"
string "org.freedesktop.SystemToolsBackends.SMBConfig"
string "org.gnome.SettingsDaemon"
]
我们也可以用python脚本调用ListActivatableNames。例如:写一个叫dls.py的脚本:
$ cat dls.py
#!/usr/bin/env python
import dbus
bus=dbus.SystemBus()
bus_obj=bus.get_object('org.freedesktop.DBus', '/')
iface=dbus.Interface(bus_obj, 'org.freedesktop.DBus')
names=iface.ListActivatableNames()
for n in names:
print n
运行:
$ ./dls.py |sort
输出为:
com.redhat.dhcp
net.ekiga.helper
net.ekiga.instance
org.freedesktop.DBus
org.freedesktop.Notifications
org.freedesktop.PowerManagement
org.freedesktop.SystemToolsBackends
org.freedesktop.SystemToolsBackends.GroupsConfig
org.freedesktop.SystemToolsBackends.HostsConfig
org.freedesktop.SystemToolsBackends.IfacesConfig
org.freedesktop.SystemToolsBackends.NFSConfig
org.freedesktop.SystemToolsBackends.NTPConfig
org.freedesktop.SystemToolsBackends.Platform
org.freedesktop.SystemToolsBackends.ServicesConfig
org.freedesktop.SystemToolsBackends.SMBConfig
org.freedesktop.SystemToolsBackends.TimeConfig
org.freedesktop.SystemToolsBackends.UsersConfig
org.freedesktop.Tracker
org.gnome.GnomeVFS.Daemon
org.gnome.Rhythmbox
org.gnome.SettingsDaemon
org.gnome.Tomboy
使用python脚本调用dbus接口是不是很简单。如果你看过dbus-glib的代码(后面会讲解),你对python的简洁会有更深刻的感触。如果你执行:
$ cat /usr/share/dbus-1/services/*|grep Name|awk -F= '{print $2}'|sort
你会得到:
com.redhat.dhcp
net.ekiga.helper
net.ekiga.instance
org.freedesktop.Notifications
org.freedesktop.PowerManagement
org.freedesktop.SystemToolsBackends
org.freedesktop.SystemToolsBackends.GroupsConfig
org.freedesktop.SystemToolsBackends.HostsConfig
org.freedesktop.SystemToolsBackends.IfacesConfig
org.freedesktop.SystemToolsBackends.NFSConfig
org.freedesktop.SystemToolsBackends.NTPConfig
org.freedesktop.SystemToolsBackends.Platform
org.freedesktop.SystemToolsBackends.ServicesConfig
org.freedesktop.SystemToolsBackends.SMBConfig
org.freedesktop.SystemToolsBackends.TimeConfig
org.freedesktop.SystemToolsBackends.UsersConfig
org.freedesktop.Tracker
org.gnome.GnomeVFS.Daemon
org.gnome.Rhythmbox
org.gnome.SettingsDaemon
org.gnome.Tomboy
这条命令的输出与ListActivatableNames的输出是不是基本相同?你能看懂上面这条命令吗?它将"/usr/share/dbus-1/services/"下所有文件交给grep筛选出包含“Name”的行。将包含“Name”的行交给awk处理,awk用"="作为列分隔符,取出第二列然后交给sort排序后输出。 "/usr/share/dbus-1/services/"目录就是dbus放service文件的地方。需要自动启动的服务器会在这个目录放一个service文件,例如:
$ cat /usr/share/dbus-1/services/dhcdbd.service
[D-BUS Service]
Name=com.redhat.dhcp
Exec=/usr/sbin/dhcdbd
Name是服务器的公共名,Exec是服务器的执行路径。在客户请求一个服务,但该服务还没有启动时。dbus会根据service文件自动启动服务。我们再写一个调用“org.fmddlmyy.Test”的Add接口的python脚本:
$ cat add.py
#!/usr/bin/env python
import dbus
bus = dbus.SessionBus()
obj = bus.get_object( 'org.fmddlmyy.Test', '/TestObj' )
iface = dbus.Interface(obj, 'org.fmddlmyy.Test.Basic')
sum = iface.Add(100, 999)
print sum
在启动“org.fmddlmyy.Test”服务器前调用这个脚本
$ ./add.py
会得到错误输出:
...
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.ServiceUnknown: The name org.fmddlmyy.Test was not provided by any .service files
我们编辑一个service文件:
$ cat org.fmddlmyy.Test.service
[D-BUS Service]
Name=org.fmddlmyy.Test
Exec=/home/lvjie/work/dbus/hello-dbus3-0.1/src/example-service
把这个文件放到"/usr/share/dbus-1/services/"目录后,再执行add.py:
$ sudo cp org.fmddlmyy.Test.service /usr/share/dbus-1/services/
$ cd ../../py
$ ./add.py
1099
这次dbus自动启动了服务器,我们的客户脚本得到了正确的输出,你有没有感到dbus的神奇?dbus在自动启动服务器后,不会自动关闭。如果没人管它,这个服务器会一直开着。
2.3.3、其它方法
再演示几个“org.freedesktop.DBus”接口的方法。NameHasOwner判断有没有连接拥有指定的公共名:
$ dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.NameHasOwner string:"org.fmddlmyy.Test"
输出为:
method return sender=org.freedesktop.DBus -> dest=:1.31 reply_serial=2
boolean true
GetNameOwner返回公共名对应的唯一名:
$ dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetNameOwner string:"org.fmddlmyy.Test"
输出为:
method return sender=org.freedesktop.DBus -> dest=:1.32 reply_serial=2
string ":1.30"
GetConnectionUnixUser返回指定连接对应的服务器进程的Unix用户id:
$ dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetConnectionUnixUser string:":1.30"
输出为:
method return sender=org.freedesktop.DBus -> dest=:1.33 reply_serial=2
uint32 1000
这就是我的用户id:
$ id -u lvjie
1000
GetId返回消息总线的ID:
$ dbus-send --session --type=method_call --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetId
输出为:
method return sender=org.freedesktop.DBus -> dest=:1.34 reply_serial=2
string "dc209fee5f8ce01b0c23da0049668f11"
3 结束语
这一集有一些python代码。即使你没有学过python,我也建议你看一看、试一试。其实我也没有学过python。小时候,好像听过什么德国人一边看说明书一边开飞机的笑话。这或许是吹牛,但对于程序员来说一边查手册一边用新语言写一些简单程序应该不算困难。下一讲我们要写一个略大点的python程序。虽然我习惯于C/C++的事必躬亲,但不可否认python确实是很有魅力的语言,难怪在嵌入式环境也有那么多人用python作原型开发。
分享到:
相关推荐
### Linux DBUS 实例讲解 #### 一、DBUS 是什么? D-Bus是一种轻量级的进程间通信(IPC)机制,专为Linux和其他类Unix操作系统设计,主要用于桌面环境中不同应用程序之间的通信以及应用程序与系统内核之间的通信。相...
- **工具**: `dbus-send`和`dbus-monitor`可用于发送消息和监控消息总线。 ##### 3.2 消息总线的方法和信号 - **概述**: 探讨了消息总线提供的方法和信号。 - **方法**: - `ListNames`: 列出当前连接到总线的所有...
DBus 是一个轻量级的消息总线系统,允许不同进程之间交换消息,而DBus-Glib 是一个 C 语言库,它为DBus 提供了更方便的绑定,尤其适合用在 GLib 和 GTK+ 的应用程序中。在这个实例中,我们将探讨如何在 C/C++ 中使用...
Go-dbus是Go语言对D-Bus消息总线系统的原生绑定,允许Go开发者与D-Bus服务进行交互。D-Bus是一种跨进程通信机制,常用于Linux桌面环境中的服务间通信,它提供了低级别的消息传递和接口定义,使得应用程序能够以标准...
DBus 总线分为系统总线与会话总线两类,两者之前不能互相通信,所以任何应用程序不能欺骗系统事件,安全性很好。 二、Dbus-glib 介绍 Dbus-glib 是 GNU 标准库,在 Dbus 接口上封装,方便上层服务与应用更好的使用...
6. **Dbu的调试和监控**:介绍如何使用工具如`dbus-monitor`来观察总线上的消息流动,帮助开发者调试和定位问题。 7. **DBus编程实例**:提供C、Python、Java等语言的代码示例,展示如何在实际项目中使用DBus。 ...
DBus的设计基于两个主要概念:总线和消息。总线是通信的基础设施,分为系统总线和会话总线。系统总线通常用于全局服务,而会话总线则针对特定用户会话中的应用。消息则是通过总线传递的信息单元,包含方法调用、信号...
- **连接管理**:使用`dbus_bus_get()`获取到消息总线的连接,通常有SESSION和SYSTEM两种总线。 - **认证**:DBus支持多种安全认证机制,如ANONYMOUS、DBUS_COOKIE_SHA1等。 - **监听**:使用`dbus_connection_...
2. **dbus-tools**:一套命令行工具,用于测试和调试DBus,如`dbus-send`用于发送消息,`dbus-monitor`用于监控总线上的消息流动。 3. **dbus-libs**:包含DBus的库文件,如动态链接库`.so`,这些库文件供其他程序...
linux下的总线通讯DBus的一个实例,还不错。
1. `dbus-daemon.exe`:DBus守护进程的可执行文件,负责消息总线的管理。 2. `dbus-launch.exe`:帮助启动和管理DBus会话的工具。 3. `libdbus-1-3.dll`:DBus库文件,用于其他程序链接和使用DBus功能。 4. `dbus....
DBUS(Desktop Bus)是一个用于进程间通信(IPC)的轻量级消息总线,广泛应用于Linux桌面环境和其他服务之间的通信。在ARM平台上交叉编译DBUS1.2,可以为基于Linux的移动设备提供强大的通信支持。 首先,"dbus-...
3. **dbus工具**:掌握基本的dbus工具,如`dbus-send`用于发送方法调用,`dbus-monitor`用于监控总线上的消息,以及`dbus-inspect`用于查看对象和接口信息。 4. **编程接口**:学习 C、Python、Java 或其他支持的...
DBus是一种轻量级的消息传递系统,常用于Linux和其他类UNIX系统中的进程间通信(IPC)。QtDbus提供了方便的API,使得Qt开发者能够轻松地实现DBus接口的调用和实现。 首先,让我们深入理解QtDbus的基本概念: 1. **...
DBus是Linux系统中的一种消息总线服务,它允许不同进程之间的通信,特别是在桌面环境中,用于应用程序间的服务共享和事件通知。在本压缩包"dbus例程.zip"中,包含了一个C语言编写的示例程序(dbus.c)以及一份文档...
DBUS是一个轻量级的消息总线服务,它允许应用程序之间创建连接,发送和接收消息。DBUS提供了同步和异步通信方式,并且支持多种接口类型,包括对象路径、接口名和信号。 在QT中使用DBUS,你需要包含相关的头文件`#...
DBus-Glib 0.98 是一个用于在Glib(GLib库)环境中与D-Bus消息总线交互的库。D-Bus是一种轻量级的、进程间通信(IPC)机制,允许不同应用程序之间共享服务和数据。Glib是GTK+图形用户界面库的基础,提供了一系列通用...
- **接口和对象路径**:每个发送或接收消息的服务都有一个唯一的接口和对象路径,类似于面向对象编程中的类和实例。 - **权限控制**:DBus支持基本的安全模型,允许设置权限以限制哪些进程可以访问特定服务。 - **...
5. 运行测试:运行测试代码,检查是否能正确连接到DBus总线,以及消息的发送和接收是否正常。 测试过程中可能遇到的问题包括但不限于: - 服务启动失败:检查是否有权限问题,或者配置文件是否正确。 - 连接失败:...
- 在 Android,DBus 主要有两种总线:系统总线(System Bus)和私有总线(Private Bus)。 - 系统总线是全局的,所有具有适当权限的服务都可以访问。通常用于系统级别的服务通信。 - 私有总线是每个应用独有的,...