如果你想深入理解dbus,可以看这个文章,个人觉得非常好的文章。
http://blog.csdn.net/fmddlmyy/archive/2008/12/23/3585730.aspx
以下是我个人为了方便记忆,所做的比喻或者想象。
强硬记忆:
dbus概念是:进程间通信(IPC)的一个实现。
/*注释:进程你懂的,进程间通信就是两个进程之间沟通,那么两个进程间沟通,就像中国人和美国人,一个讲中文,一个讲英语,沟通不了,必须要有一种语言才行,要两个人都会同一种语言才行。进程间通信,要用一个规定的接口规则,这个就是dbus*/
dbus就像soap这些一样,是一个接口。这个接口是有一定规则的,符合规则,就可以调用使用dbus技术的程序
我们把这样的操作,分为server和client,可能方便理解点。
[使用dbus规则制造的Server]<----dbus规则接口<----[Client]
规则,规则就是定死的,其实没有什么理解可言,死记就好了
一个dbus server程序,写程序的时候,要有如下属性
Bus Name 链接的名称
Object Paths对象路径
Interfaces 接口
Methods和Signals 方法和信号
应用程序example-service和会话总线连接。这个连接获取了一个众所周知的公共名“org.fmddlmyy.Test”。应用程序example-servic中有对象“/TestObj”提供了接口“org.fmddlmyy.Test.Basic”,接口“org.fmddlmyy.Test.Basic”有方法“Add”。应用程序d-feet和会话总线连接,要求调用连接“org.fmddlmyy.Test”上对象“/TestObj”的接口“org.fmddlmyy.Test.Basic”的方法“Add”。
应用程序B调用应用程序A的方法,其实就是应用程序B向应用程序A发送了一个类型为“method_call”的消息。应用程序A通过一个类型为“method_retutn”的消息将返回值发给应用程序B。
dbus-send的详细用法可以参阅手册。调用远程方法的一般形式是:
$ dbus-send [--system | --session] --type=method_call --print-reply --dest=连接名 对象路径 接口名.方法名 参数类型:参数值 参数类型:参数值
dbus-send支持的参数类型包括:string, int32, uint32, double, byte, boolean。
python的example
http://cgit.freedesktop.org/dbus/dbus-python/tree/examples/example-service.py
查看dbus清单
dbus-send --session --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.ListActivatableNames
查看某dbus的节点
dbus-send --session --type=method_call --print-reply --dest=org.fmddlmyy.Test / org.freedesktop.DBus.Introspectable.Introspect
查看dbus的节点下面的函数或者子节点
dbus-send --session --type=method_call --print-reply --dest=org.fmddlmyy.Test /TestObj org.freedesktop.DBus.Introspectable.Introspect
并不是所有的服务都实现了org.freedesktop.DBus.Introspectable的,没实现的自然查不到,有兴趣可以用dbus-monitor看看内部的消息流----引用自freeworkzz
python的例子:
#!/usr/bin/env python
import dbus
import dbus.service
import dbus.glib
import gobject
class BaseObject(dbus.service.Object):
def __init__(self, bus_name, object_path="/BaseObject"):
dbus.service.Object.__init__(self, bus_name, object_path)
@dbus.service.method("org.smk.SampleInterface", 'ui', 'i')
def AddNum(self, a, b):
return (a+b)
session_bus = dbus.SessionBus()
name = dbus.service.BusName("org.smk.EventService", bus=session_bus)
object = BaseObject(name)
mainloop = gobject.MainLoop()
mainloop.run()
没有评论:
发表评论