DBus是Linux使用的进程间通信机制,允许各个进程互相访问,而不需要为每个其他组件实现自定义代码。即使对于系统管理员来说,这也是一个相当深奥的主题,但它确实有助于解释linux的另一部分是如何工作的。

这里主要介绍 dbus-send 与 GDbus cli工具,其他的还有QtDbus , d-feet...

命令行工具dbus-send ,是freedesktoop提供的dbus包配套的命令客户端工具,可用于发送dbus消息。

GDbus GLib实现的dbus工具。较与 dbus-send,拥有更完整的功能。

d-feet: 可以处理所有D-Bus服务的GUI应用程序。

dbus-send

dbus有两种消息总线 (message bus):system bus 和 session bus,通过使用 --system和 --session 选项来通过dbus-send 向系统总线或会话总线发送消息。如果两者都未指定,默认为**session bus*.

借此,顺道聊下 system bus 和 session bus:

  • System Bus:

    • 在桌面上,为所有用户提供一条总线.
    • 专用于系统服务。
    • 有关于低级时间,例如 网络连接,USB设备。
    • 在嵌入式Linux系统中,system bus是唯一D-Bus类型。
  • Session Bus:

    • 每个用户会话一个实例
    • 为用户应用提供那个桌面服务。
    • 连接到 X-session

参数选项

--dest=NAME : 这个是必选的参数,指定要接收消息的接口名称。例如 org.freedesktop.ExampleName 。

--print-reply: 打印回复消息。

--print-reply=literal: 如选项一样,打印回复正文。如有特殊字符,如对象或 object 则按字面打印,没有标点符号、转义字符等。

--reply-timeout= : 可选参数,等待回复的超时时长,单位为 毫秒。

--system|--session: 发送的消息是system bus还是session bus,默认为 session bus.

--type=method_call|signal: 调用的方法:默认为signal。

必须始终指定要发送的消息的对象路径和名称。以下参数(如果有)是消息内容(消息参数)。这些值作为类型指定的值给出,可能包括如下所述的容器(数组、dict和变体)。

支持参数

dbus-send 发送的消息,在调用方法需要传参数时,必须将这些值给出。dbus-send 支持传入的参数的类型,并不为D-Bus支持的所有的数据类型,仅为一些简单的类型:如

  • Type: 这里type 仅仅为简单的数据类型,即 type:content ,支持的内容如下: string | int16 | uint16 | int32 | uint32 | int64 | uint64 | double | byte | boolean | objpath。
  • 数组:array = array:<type>:<value>[,<value>...]
  • 词典: dict = dict:<type>:<type>:<key>,<value>[,<key>,<value>...]。
  • 变体:variant = variant:<type>:<value>。

根据官网的解析出来后如上述集中数据类型,更详细的描述可以根据官方 dbus-send 进行参考。

可以通过一张图来理解 dbus-send 发送一个消息所需的几个必须参数

通过简单的命令,来了解一个 dbus-send 命令如何传入参数

 dbus-send --dest=org.freedesktop.ExampleName \  # service
/org/freedesktop/sample/object/name \ # object
org.freedesktop.ExampleInterface.ExampleMethod \ # interface.method
int32:47 string:'hello world' double:65.32 \ # param int
array:string:"1st item","next item","last item" \ # param array
dict:string:int32:"one",1,"two",2,"three",3 \ # param dict
variant:int32:-8 \ # param variant
objpath:/org/freedesktop/sample/object/name # param object_path

使用案例

如列出所有总线接口

dbus-send --session \
--dest=org.freedesktop.DBus \
--type=method_call \
--print-reply \
/org/freedesktop/DBus \
org.freedesktop.DBus.ListNames

查看对方总线所支持的对象接口,org.freedesktop.DBus.Introspectable 、org.freedesktop.DBus.Properties 和 org.freedesktop.PowerManagement。每个接口实现一些方法和信号。这些是你可以与之互动的东西。

dbus-send --session \
--type=method_call \
--print-reply \
--dest=org.freedesktop.DBus \
/ \
org.freedesktop.DBus.Introspectable.Introspect

dbus-send,也支持调用远程总线接口,通过默认通过 DBUS_SESSION_BUS_ADDRESS 或 DBUS_SYSTEM_BUS_ADDRESS,来指定远程的总线。

DBUS_SESSION_BUS_ADDRESS=""
dbus-send --session \
--type=method_call \
--print-reply \
--dest=org.freedesktop.DBus \
/ \
org.freedesktop.DBus.Introspectable.Introspect

gdbus

gdbus是 GLib实现的dbus工具。较与 dbus-send,拥有更完整的功能。

introspect : 可以打印出对象的接口和属性值。对应对象的所有者需要实现org.freedesktop.DBus.Introspectable 的接口。使用 --xml选项,将打印返回的xml 格式。--recurse 选项可将其子级等打印,--only 选项仅打印具有属性的接口。

monitor: 类似于 dbus-monitor

call: 调用一个方法,传入的必须为 GVariant ,而相应的也为GVariant。

emit: 发出信号。信号中包含的每个参数除字符串外都必须序列化为GVariant。

使用案例

gdbus introspect --system \
--dest org.freedesktop.UPower \
--object-path \
/ \
--recurse \
--only-properties

通过call 来向一个dbus service发送信息

gdbus call --session \
--dest org.freedesktop.Notifications \
--object-path /org/freedesktop/Notifications \
--method org.freedesktop.Notifications.Notify \
my_app_name \
42 \
gtk-dialog-info \
"The Summary" \
"Here's the body of the notification" \
[] \
{} \
5000
(uint32 12,)

监听一个服务的对象

gdbus monitor \
--system \
--dest org.freedesktop.NetworkManager \
--object-path /org/freedesktop/NetworkManager/AccessPoint/4141

发送信号

gdbus emit --session \
--object-path /foo \
--signal org.bar.Foo "['foo', 'bar', 'baz']"

想特定进程发送信号,`--dest 为指定进程。

 gdbus emit \
--session \
--object-path /bar \
--signal org.bar.Bar someString \
--dest :1.42

dbus客户端使用指南的更多相关文章

  1. RabbitMQ-Java客户端API指南-下

    RabbitMQ-Java客户端API指南-下 使用主机列表 可以将Address数组传递给newConnection().的地址是简单地在一个方便的类com.rabbitmq.client包与主机 ...

  2. RabbitMQ-Java客户端API指南-上

    RabbitMQ-Java客户端API指南-上 客户端API严格按照AMQP 0-9-1协议规范进行建模,并提供了易于使用的附加抽象. RabbitMQ Java客户端使用com.rabbitmq.c ...

  3. Apollo(阿波罗)配置中心Java客户端使用指南使用指南

          Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管 ...

  4. 【原创】轻量级即时通讯技术MobileIMSDK:Android客户端开发指南

    申明:MobileIMSDK 目前为个人维护的原创开源工程,现陆续整理了一些资料,希望对需要的人有用.如需与作者交流,见文章底签名处,互相学习. MobileIMSDK开源工程的代码托管地址请进入 G ...

  5. 【Openvpn】iOS OpenVPN客户端设置指南(适用iPhone/iPad)

    适用于iPhone/iPad/这些iOS设备.之前iOS使用OpenVPN是需要越狱的,并且是付费第三方应用. 去年开始OpenVPN官方推出了iOS客户端就好用多了,免费也无需越狱. 说明:如果是新 ...

  6. firewalld dbus接口使用指南

    firewalld,一个基于动态区的iptables/nftables守护程序,自2009年左右开始开发,最新版本 - 防火墙0.6.3 - 发布于2018年10月11日.主要的开发人员是托马斯·沃纳 ...

  7. Redis 客户端重试指南

    本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可. 在互联网服务中,特别是在云环境下,网络及硬件环境复杂,所有应用程序都可能遇到暂时性故障.暂时性故障包括瞬时的网络抖动,服务暂时不可 ...

  8. ORACLE8.07客户端配置指南

    —本地机器网络连通配置 1.点击“开始”-〉“程序”菜单. 2.选择“Oracle-OracleHome81”-〉“Net Administrator”->“Net8 Configuration ...

  9. smartsvn学习(一)Xcode下svn客户端使用指南

    http://smartsvn.com/features 说明 场景 执行步骤 创建新项目 一,二,三,四 下载项目 一,二,四 代码提交 五 代码更新 六 一,打开SCM 在xcode中,点击菜单: ...

随机推荐

  1. 字节跳动基于Apache Hudi构建EB级数据湖实践

    来自字节跳动的管梓越同学一篇关于Apache Hudi在字节跳动推荐系统中EB级数据量实践的分享. 接下来将分为场景需求.设计选型.功能支持.性能调优.未来展望五部分介绍Hudi在字节跳动推荐系统中的 ...

  2. REST设计风格:你写的 RESTful API 到第几层了?

    理解REST 在理解其真正概念前,我们先来明确: REST它的核心思想是面向资源的抽象(相对于RPC就是面向过程抽象),它是一种设计风格的指导,而非具有较强约束的协议. REST源于Roy Thoma ...

  3. Linux CentOS7 安装配置 IPtables

    2021-08-11 1. 前言 防火墙其实就是实现 Linux 下访问控制功能的,分为硬件和软件的防火墙两种类型.无论在何网络中,防火墙工作的地方一定是网络的边缘.防火墙的策略.规则就是去定义防火墙 ...

  4. sublime text build system automatic ctrl/cmd+B自动选择 python2 或 python3

    背景 我同时安装了 python2 和 python3 时,python 指向 python2,python3 才是 python3 默认情况下,在 Sublime 内 Ctrl/Cmd + B 运行 ...

  5. 超详细kafka教程来啦

    Kafka的概念和入门 Kafka是一个消息系统.由LinkedIn于2011年设计开发. Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度O(1)的方式提供消息持 ...

  6. TypeScript 中函数的理解?与 JavaScript 函数的区别?

    一.是什么 函数是JavaScript 应用程序的基础,帮助我们实现抽象层.模拟类.信息隐藏和模块 在TypeScript 里,虽然已经支持类.命名空间和模块,但函数仍然是主要定义行为的方式,Type ...

  7. Linux(二)——常用命令

    一.一般指令 立刻关机:shutdown -h now 1分钟后关机:shutdown -h 1 立刻重启:shutdown -r now 立刻关机:halt 立刻重启:reboot 把内存的数据同步 ...

  8. 20210821 打表,蛇,购物,ants

    考场 T1 没看懂 T4 一眼回滚莫队,但忘记怎么写了,小慌 模拟 T1 题意的时候教练让 zsy 澄清了一下,确定了我不会做... T2 一看就是毒瘤题,T3 感觉比较可做 T4 确定了回滚的细节, ...

  9. 【曹工杂谈】Maven底层容器Plexus Container的前世今生,一代芳华终落幕

    Maven底层容器Plexus Container的前世今生,一代芳华终落幕 前言 说实话,我非常地纠结,大家平时只是用Maven,对于内部的实现其实也不关心,我现在非要拉着大家给大家讲.这就有个问题 ...

  10. Haproxy搭建web集群

    目录: 一.常见的web集群调度器 二.Haproxy应用分析 三.Haproxy调度算法原理 四.Haproxy特性 五.Haproxy搭建 Web 群集 一.常见的web集群调度器 目前常见的we ...