2010年10月3日星期日

无痛理解dbus

搞来搞去还是java的service好点,python也不错,但webos里面除了用chroot方法获得python,貌似现在找不到装python的方案。就是他妈的c的太难了。



如果你想深入理解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()

没有评论:

发表评论