现在我们在网上都有很多身份,例如我自己,就有三/四个MSN帐号,还有QQ,GTalk,而web方式的,还有几个Blog,几个vblog,总之很多。而尺寸小的手机、MID这类手持设备,我们不可以好像desktop那样,开着N个client,打开N个网页,其实我们不在乎我们在使用那个软件,我们只希望找到找到联系人。D-Bus提供了IPC通信基础,有很多机制都建立在D-Bus上面,D-Bus给出基础的通道,而在这个通道上有还有很多高层的封装,针对某些特定的应用。telepathy是其中之一,针对char,voip类应用。很满足我们的需求,因此有必要研究一下。

  wiki的telepathy给出下面这个图:

D-Bus学习(十):在D-Bus上的telepathy[一]:纸上谈兵_dictionary

Telepathy是灵活的,模块化的,支持pluggable实时的通信协议的通信框架。使用D-Bus作为分属不同进程组件的IPC。telepathy客户端使用D-Bus API(telepathy-glib)共享多个客户端(例如IM,Email应用的呈现等等)之间的连接。有下面的特点:


  • 实时性:Telepathy支持IM(支持点对点和群组) ,语音呼叫和视频呼叫,和D-Bus一样,他不适合存储转发的应用,例如email的收发)
  • 整合性: 不同的开发者都可以从这些通信中获益,Telepathy可将开发者将各自的程序整合在一起。
  • 模块化: Telepathy组件是模块化的,开发者可以集中精力开发各自的组件。

  从网上的资料看telepathy是NOKIA发展起来的。在NOKIA的maemo中包含。在Moblin/MeeGO中也含有这部分。XMPP支持大部分我们常见的IM协议,例如Gtalk SIP,MSN,ICQ,OO,Facebook char,AIM,QQ,IRC。对于我们,最商用的就是MSN和QQ。而Nokia还将其扩展到电话通信,例如Voip的Skype,2G/3G移动通信Phone/SMS。看起来非常之吸引,所以值得认真学习一看,看看是否带来惊喜。在http://telepathy.freedesktop.org/wiki/Protocols%20Support给出一个表,给出这些IM在语音聊天、视频聊天、文件传输、Invisible mode下目前telepathy是否支持。invisible mode不是很理解,可能是“潜水”。对于支持上网的handset设备,这些特点我觉得还不算很需求,但是一个重要的,提高价值的,锦上添花的,证明有档次的应用(^_^)。

  下面是一些重要的资料,也是下一阶段要学习的。

http://telepathy.freedesktop.org/wiki/Setup:关于安装不过moblin,阿土(ubuntu)和fadora都支持,到是缺那个包就用那个。

http://telepathy.freedesktop.org/spec/:描述D-Bus接口定义

http://telepathy.freedesktop.org/wiki/System%20Overview:框架结构介绍

http://people.collabora.co.uk/~danni/telepathy-book/:开发人员手册

http://telepathy.freedesktop.org/doc/telepathy-glib/:telepathy-glib手册

http://telepathy.freedesktop.org/doc/telepathy-qt4/:telepathy-qt4手册

很多资料都可以从wiki入口中寻找。

  Telepaphy是一个规范(spec),定义一套D-Bus的接口,以及一堆应用(是接口规范,但是是否包含应用就不是很明确,看怎么理解吧)。针对处理我们常见的IM类应用,除了常见的文字聊天,包括聊天室,还可以涉及音通话,视频通话,以及文件传输,它定义了一套IPC的通信机制,对这些IM应用进行操作,获取联系人的状态,信息,以及触发某个处理。

  通过读取.manager文件,需要建立一个proxy对象。在.manager文件中描述了连接管理支持的协议以及所需的参数。给这个链接管理器一个unique名字,则建立一个D-Bus Proxy。

这里我们用D-Bus的标准语言描述一下,在Telepathy中,server是IM这些应用,我们的开发程序是client。为连接管理器为应用建立了一条与DBus的连接,给出远端接口的路径,建立了一个proxy,通过对Proxy的操作,实际操作远端接口的方法。这一步骤有些类似之前在D-Bus中学习中client建立与远端某个接口的连接。

proxy = dbus_g_proxy_new_for_name(conn/*连接管理器*/,"com.wei.test"/*remote的bus name*/, "/com/wei/MyObject"/*remote的对象名*/,"com.wei.MyObject.MyInterface"/*remote的接口名*/);

(其中远端应用的Bus name的well known名字是org.freedesktop.Telepathy.ConnectionManager.gabble)。如果连接失败,则D-Bus daemon会使用gabble.service文件启动Gabble服务。如果连接上,可以使用RequestMethod来调用method。

  在telepathy还有一些新的概念。以IM例子,在接口上,我们使用RequestHandles (1/*1是handle的类型,1==contact*/, ['your@jid.org ']*/),将返回一个[2],例如是numbers的list,我们与其中一个number进行通信。在这个例子中1表示的类型,就是D-Bus中的参数类型,例如u == uint32, au == array of uint32, a(uu) == array of (struct of uint32, uint32), s == string, a{su} == dictionary of (string to uint), aau == array of (array of uint32)。接着我们将请求一个channel,RequestChannel ('org.freedesktop.Telepathy.Channel.Type.Text', 1, 2, True),第一个参数是interface的名字,1是handle的类型,2是handle。“true”表示telepathy client说明要试图获取此channel的handle。如果连接管理器同意你的请求,他将返回string,说明D-Bus object的路径,这样我们通过connection的bus名字和获取的路径名,为那个channel对象建立proxy,并利用proxy调用那个channel的call method。

telepathy和普通的D-Bus向比较,它定义了一套学习机制,使得client能够学习server的D-BUS接口,而无需一开始就明确D-Bus的xml表述。如果server升级后出现接口变化,client能够自动适配这种变化。进程之间的通信不会因为某个一个进程升级,接口修改,而导致所有进程修订。换句话,它是智能的。