DBus入门实践(1): 基本概念

基本概念

可以参考下面链接.或者是官方的教程.

 1. linux,dbus示例 Knowing some basic things by example, 推荐:

http://laokaddk.blog.51cto.com/368606/943133

        http://laokaddk.blog.51cto.com/368606/943148/  

2. Documents Reference    D-Bus Specification would give some basic overview  of the concepts

                        https://dbus.freedesktop.org/doc/dbus-specification.html


DBUS可以完成1对1的IPC, 多对多的IPC, 多对多需要daemon,和android中的service_manger类似,如同router.


DBus的组成

DBus = 对象+消息+link+DbusDaemon

对象

特征

  • 其中对象是一个处理消息的实体, 因此其实是服务端server
  • 对象中有一个或者多个接口
  • 每个interface有一个或者多个method
  • 每个method都是对具体消息的处理

所以最终落实到消息, 消息共有四种,包括了signal,见下面的说明. 对象的寻址用路径表示

路径

在多对多的IPC中,使用路径来表明一个对象的位置, 这个路径和router中的路由很类似. 都是寻址. 

消息的传递变成了先到Daemon中转,然后由DBus Daemon转发.

消息

消息传输

  • 双向传输:这样子就可以在调用一个method接收返回值
  • 传输方式:同步+异步

消息的类型

  • 调用消息
  • 结果返回消息
  • 错误消息
  • 信号消息

Dbus Daemon

可以有多个,一般一个系统中至少有两个,一个是system,一个是session, 这个Linux中的OS的组成有关,想象一下,我们使用Remote Desktop,同一个账号,分两个,登陆到Linux中,分别使用的Desktop environment分别为gnome和KDE, 这两个Desktop Env各种两套不同的NetworkManger, 两套Software Updater, 此时就需要相互通讯, 同时管理这两个或者多个Desktop Env/Session的是X Window Manager, 这个WM也需要管理和给这两个不同的Desktop Env/Session发送消息, 因此就出现了:

  • DBUS_BUS_SYSTEM: 系统相关的,例如将update消息发送到session中
  • DBUS_BUS_SESSION: 在同一个DE环境下的不同Application的通讯

这两种daemon. 且两者管理的内容不一样.


DBus的使用

这个过程和使用路由器来连接不同的电脑非常类似. 可以认为是3步:

  1. DBus Daemon的启动
  2. 对象Server的注册
  3. 客户端使用服务,即IPC通讯

下面是详细的说明.

对象Server的注册与连接

对于多对多的IPC通讯, 首先需要有一个DBus Daemon, 然后各个对象(即Server)到Daemon中注册并建立连接, 这个过程如同在路由器中分配了一个IP地址, 此时其他电脑才可能能够通过这个IP来访问这台电脑, "IP"就是前面的路径.

其中这里面的注册和连接也是使用代理(想象一下, 其实这个时候Server对象其实也是DBus Daemon的client, 所以和下面的客户端使用服务是类似的), 通过接口dbus_g_object_type_install_info, 将安装信息(对象的信息), 传递给DBus Daemon, 然后使用Daemon的Proxy调用RequestName来注意个对象的名字/路径.


其中安装信息由XML文件,通过dbus-binding-tool转换成对象的头文件。参考: 

https://fabricioepa.wordpress.com/2010/12/16/d-bus-tips-3-0-performing-asynchronoussynchronous-method-invocations-and-dbus-binding-tool/


客户端使用服务

建立与DBus Daemon的连接

创建对象的代理(Proxy),就如同如果想和某个公司沟通,那么可以找到他们的服务部的代表人员

然后通过Proxy来完成所有的操作, 如同和公司的业务部门人员洽谈买芯片.

  这里的操作都是使用Msg来传递的, 看前面message的种类. 同时这些Message的发送接收可以是同步也可以是异步


消息的组成

消息= Msg Header + Msg Content

Msg Header

由固定的字段来组成,这样子的约定才能让Dbus Daemon可以解析

Msg Content

由string组成, 开头需要为8Byte对齐


参考

http://linoxide.com/how-tos/d-bus-ipc-mechanism-linux/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DBus::Connection是DBus C++ API中的一个类,用于管理DBus连接。它提供了以下方法: 1. `DBus::Connection::Connection(DBus::BusType type, DBusError* error)`:构造函数,用于创建一个DBus连接对象。 2. `DBus::Connection::~Connection()`:析构函数,用于销毁DBus连接对象。 3. `DBus::Connection::send(const DBusMessage& message, DBusPendingCall*& pending, int timeout)`:发送DBus消息,并在指定时间内等待响应。 4. `DBus::Connection::send_with_reply(const DBusMessage& message, DBus::MessageIter& iter)`:发送DBus消息,并等待响应。 5. `DBus::Connection::send_with_reply_and_block(const DBusMessage& message, int timeout)`:发送DBus消息,并等待响应,直到超时或收到响应。 6. `DBus::Connection::dispatch(DBusDispatchStatus* status)`:使用DBus事件循环处理DBus消息。 7. `DBus::Connection::add_filter(DBus::MessageFilterFunction function, void* user_data, DBus::FreeFunction free_data_func)`:添加DBus消息过滤器。 8. `DBus::Connection::remove_filter(DBus::MessageFilterFunction function, void* user_data)`:移除DBus消息过滤器。 9. `DBus::Connection::register_object(const char* path, const DBus::InterfaceVTable& vtable, void* user_data)`:注册DBus对象。 10. `DBus::Connection::unregister_object(const char* path)`:注销DBus对象。 11. `DBus::Connection::register_service(const char* service_name)`:注册DBus服务。 12. `DBus::Connection::unregister_service(const char* service_name)`:注销DBus服务。 13. `DBus::Connection::request_name(const char* name, unsigned int flags)`:请求DBus名称。 14. `DBus::Connection::release_name(const char* name)`:释放DBus名称。 15. `DBus::Connection::list_registered() const`:获取已注册的DBus名称。 这些是DBus::Connection类的常用方法,但不一定是全部方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值