dbus-send和dbus-monitor命令详解

1. 概述

D-Bus 是 Linux 上的一种进程间通信方式,内部使用 socket 技术实现。是 freedesktop.org 专案的一部分,其设计目的是使Linux桌面环境(如GNOME与KDE等)提供的服务标准化。

应用程序可以在总线上注册 D-Bus 服务,对其他程序提供函数接口服务和信号通知。 客户端可以调用服务的接口和绑定服务的信号通知。

D-Bus 有两条总线,分别是 system bus 和 session bus。

  • system bus: 系统总线。顾名思义,通常被系统框架使用。和常规应用分来是为了避免消息拥塞造成延迟或卡顿。
  • session bus: 会话总线。常规应用使用。

D-Bus 提供两个命令工具,使用 dbus-send 命令发送消息可以调用 dbus 服务的方法,使用 dbus-monitor 命令可以监控 dbus 服务发出的信号。

借助这两个命令我们可以对创建的 dbus 服务进行接口测试,而不必编码测试接口功能是否符合预期。

2. 命令 dbus-send 详解

dbus-send 命令其本质是将消息发送到指定的总线上去,总线再分发到对应的服务触发接口调用。官方链接:DBUS-send。命令的全参数如下:

dbus-send [ --system | --session | --bus=ADDRESS | --peer=ADDRESS ] [--sender=NAME] [--dest=NAME] [ --print-reply [=literal]] [--reply-timeout=MSEC] [--type=TYPE] OBJECT_PATH INTERFACE.MEMBER [CONTENTS...]
参数说明
[ --system | --session | --bus=ADDRESS | --peer=ADDRESS ]–system 系统总线
–session 会话总线(默认)
–address ADDRESS:监视在ADDRESS处给定的任意消息总线
–peer=ADDRESS:端口
[–sender=NAME]指定发送者名称,告诉接受者消息来源。不指定会被默认为用户名或进程名。通常无需指定。
[–dest=NAME]必选的参数,dbus 服务名称 ,如: com.myos.conf
[ --print-reply [=literal]]–print-reply:打印回复消息,也带代表着–type=method_call。
–print-reply=literal:打印发送的消息的回复,并打印回复的正文。如果回复是对象路径或字符串,则按字面意思打印,不带标点符号、转义字符等。
[–reply-timeout=MSEC]等待回复的超时时长,单位为 毫秒。默认25秒超时。
[–type=TYPE]method_call:方法调用
signal:信号(默认)
OBJECT_PATH INTERFACE.MEMBER [CONTENTS…]依次填写对象路径、接口名.方法名、参数(可多个)。均以空格隔开。

有些方法需要传递参数,也就是上表中数组 [CONTENTS…] 的内容。参数之间空格隔开即可。如:

dbus-send --system --print-reply=literal --dest=com.myos.conf /conf com.myos.conf.setValue string:"language" string:"zh_CN"

dbus-send 支持的参数类型完整列表如下:

参数说明示例
:基本类型参数,type取值:
string
int16
uint16
int32
uint32
int64
uint64
double
byte
boolean
objpath
int32:47
string:‘hello world’
double:65.32
objpath:/org/freedesktop/sample/object/name
array::[,…]数组参数array:string:“1st item”,“next item”,“last item”
dict:::,[,,…][,…]字典参数dict:string:int32:“one”,1,“two”,2,“three”,3
variant::变体参数variant:string:“zhangsan”
variant:int32:-8

2.1 查看已注册的系统服务

使用命令查看 system bus 上已经注册的总线有哪些:

 # dbus-send --system --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListNames 
2514 : dbus_connection_send_with_reply_and_block try to send to org.freedesktop.DBus : org.freedesktop.DBus : Hello message 2514 : dbus_connection_send_with_reply_and_block try to send to org.freedesktop.DBus : org.freedesktop.DBus : ListNames message method return time=1690351431.030058 sender=org.freedesktop.DBus -> destination=:1.216 serial=3 reply_serial=2 array 
[ 
... 
string "org.freedesktop.DBus" 
... 
]

2.2 查看指定服务的接口列表

系统服务很多,篇幅限制省略一些。以 “org.freedesktop.DBus” 服务示例。通过服务名称,获取这个服务提供了哪些接口:

# dbus-send --system --print-reply=literal --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.Introspectable.Introspect 

命令参数的意义如下:

参数说明
–system指定发送消息到system bus,session bus 使用 --session 参数。
–print-reply=literal打印回复信息
–dest=org.freedesktop.DBusdbus service name
/org/freedesktop/DBuspath
org.freedesktop.DBus.Introspectable.Introspectinterface和method的拼接

查询服务注册的接口

# dbus-send --system --print-reply=literal --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.Introspectable.Introspect 
... 
<method name="StartServiceByName"> 
<arg direction="in" type="s"/> 
<arg direction="in" type="u"/> 
<arg direction="out" type="u"/> 
</method> 
...

返回的消息显示其中一个方法名称为 “StartServiceByName” ,有两个输出参数和一个返回值。参数类型有这些:

类型签名类型说明
类型签名类型说明
s字符串 (String)UTF-8编码的字符串
i有符号整数 (Signed Integer)32位有符号整数
u无符号整数 (Unsigned Integer)32位无符号整数
b布尔类型 (Boolean)取值为 true 或 false
d双精度浮点数 (Double)64位浮点数
o对象路径 (Object Path)用于表示DBus对象的路径
g签名 (Signature)用于表示DBus类型签名字符串
y字节 (Byte)8位无符号整数
a{…}字典 (Dictionary)键值对的集合
v变体 (Variant)用于包装任意类型的值
()空元组 (Empty Tuple)表示没有参数
(type1 type2 …)元组 (Tuple)包含一组有序的参数
as字符串数组 (Array of Strings)由多个字符串组成的数组
ai有符号整数数组 (Array of Signed Integers)由多个有符号整数组成的数组
au无符号整数数组 (Array of Unsigned Integers)由多个无符号整数组成的数组
ab布尔数组 (Array of Booleans)由多个布尔值组成的数组

2.3 调用服务的方法

假如开发了一个系统配置的服务,可以设置键值对, D-Bus 服务的信息如下:

D-Bus 服务信息
Service Namecom.myos.conf
Path/conf
Interfacecom.myos.conf

其中注册了一个方法,原型如下:

bool setValue(string key, string value)

那调用此方法的命令就是这样的:

dbus-send --system --print-reply=literal --dest=com.myos.conf /conf com.myos.conf.setValue string:"language" string:"zh_CN"

上面的命令可以看出来如何给方法传递常规参数,除了基本类型,还支持数组、字典、variant(变体)。 |

2.4 发送服务信号

模拟服务发出信号,需指定–type为signal。参数传递和调用方法类似。并且不要打印回复,因为只有函数调用有回复。指定打印回复会默认–type为method_call。
下面命令将模拟发出一个void valueChanged(string key,string value)信号。

dbus-send --system --type=signal  --dest=com.myos.conf /conf com.myos.conf.valueChanged string:"language" string:"zh_CN"

3. 命令 dbus-monitor 详解

dbus-monitor 是总线消息监视器。可以监控总线上的消息。官方文档DBUS-monitor。命令的全参数如下:

dbus-monitor [ --system | --session | --address ADDRESS ] [ --profile | --monitor | --pcap | --binary ] [ watch expressions ]
参数说明
[ --system | --session | --address ADDRESS ]–system 系统总线
–session 会话总线(默认)
–address ADDRESS:监视在ADDRESS处给定的任意消息总线
[ --profile | --monitor | --pcap | --binary ]–profile:使用配置文件模式打印
–monitor:使用dbus-monitor模式打印(默认)
–pcap:将PCAP文件头添加到输出的开头,并为每个消息添加PCAP消息头
–binary:二进制模式将输出整个二进制消息流
[ watch expressions ]如监控一个信号:“type=‘signal’,sender=‘org.gnome.TypingMonitor’,interface=‘org.gnome.TypingMonitor’”

下面这个命令可以监控 org.gnome.TypingMonitor 服务 org.gnome.TypingMonitor 接口上发出的信号

 dbus-monitor "type='signal',sender='org.gnome.TypingMonitor',interface='org.gnome.TypingMonitor'"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/8520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信号——进程间最古老的通信方式之一

文章目录 信号信号的5种默认处理动作查看core文件中的错误信息常见函数killraiseabortalarmsetitime 信号 SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAPSIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERMSIGS…

R语言 PCA筛选变量

#PCA-筛选变量 X <- data[,2:415] pca <- prcomp(X, center TRUE, scale. TRUE) # 进行主成分分析 summary(pca) # 查看各个主成分的解释方差比例 library(factoextra) #碎石图依赖-fviz fviz_eig(pca,addlabelsT) #碎石图 X_selected <- pca$x[,1:20] # 选择前n个主…

饮用水、地下水除砷的方法——砷吸附树脂

砷&#xff08;As&#xff09;为非人体必需元素&#xff0c;既不溶解于水又不溶解于酸&#xff0c;在自然界有三价无机态 As(III)、五价无机态 As(V)以及有机砷MMA(甲基胂酸)、DMA(二甲基胂酸)、TMA(三甲基胂酸)等。 砷在水体中主要以三价和五价的无机酸形式存在&#xff0c;三…

CDN、P2P、PCDN的区别是什么

本篇文章为大家介绍一下与网络加速有关的几个重要概念&#xff0c;一起了解一下CDN,P2P和PCDN究竟是什么吧&#xff01; 1. CDN CDN即Content Delivery Network&#xff0c;中文全称为内容分发网络。 如果内容离用户远&#xff0c;用户可能无法获得及时的响应&#xff0c;那…

读kafka生产端源码,窥kafka设计之道(下)

背景 在上一篇文章《读kafka生产端源码&#xff0c;窥kafka设计之道&#xff08;上&#xff09;》 留下了kafka设计上比较优秀的一个点&#xff1b;内存的循环使用。本篇文章准备盘盘它。 好奇 为什么 kafka减少发送消息时向JVM频繁申请内存&#xff0c;就可以降低JVM GC的执…

任务的创建与删除

Q: 什么是任务&#xff1f; A: 任务可以理解为进程/线程&#xff0c;创建一个任务&#xff0c;就会在内存开辟一个空间。 比如&#xff1a; 玩游戏&#xff0c;打篮球&#xff0c;开车&#xff0c;都可以视为任务。 Windows 系统中的 MarkText 、谷歌浏览器、记事本&#xff0…

React Dva项目中模仿网络请求数据方法

我们都已经选择react了 那么自然是一个前后端分离的开发形式 至少我在公司中 大部分时候是前后端同时开发的 一般你在开发界面没有接口直接给你 但你可以和后端约定数据格式 然后在前端模拟数据 我们在自己的Dva项目中 在根目录下的 mock 目录下创建一个js文件 我这里叫 filmDa…

开源视频监控管理平台国标GB28181视频EasyCVR电子地图功能展示优化

视频汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频监控综合管理平台EasyCVR可提供的视频能力包括&#…

基于JavaSE的手机库存管理系统

1、项目背景 基于JavaSE完成如下需求&#xff1a; 功能需求&#xff1a; 1、查询库存量 2、可以修改库存中不同品牌手机的个数 3、退出系统 实现步骤&#xff1a; 1、把List当做库房 2、把手机存放在库房中 3、使用封装的方法区操作仓库中的手机 2、项目知识点 面向对象 集合…

AI Chat 设计模式:9. 命令模式

本文是该系列的第九篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 介绍下命令模式A.1Q.2 详细说说命令模式适用于啥场景呢A.2Q.3 举一个命令模式的例子&a…

基于SpringBoot的开源项目/demo汇总

一些基于SpringBoot的开源项目&#xff0c;方便大家学习&#xff0c;参考。持续更新&#xff0c;排名不分先后。也欢迎贡献&#xff08;回复此贴&#xff09;。 1、GitHub - Tencent/APIJSON: &#x1f3c6; 零代码、全功能、强安全 ORM 库 &#x1f680; 后端接口和文档零代码…

Wireshark抓包分析教程(ubuntu版本)

安装 first&#xff0c;多亏我们的C知道&#xff0c;成功安装了wireshark&#xff0c; Steps are as following&#xff1a; 添加wireshark的软件源(PPA:personal package archive(档案)) sudo apt-add-repository ppa:wireshark-dev/stable ppa:wireshark-dev/stable 是一个…

C++语法(26)--- 特殊类设计

C语法&#xff08;25&#xff09;--- 异常与智能指针_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131537799?spm1001.2014.3001.5501 目录 1.特殊类设计 1.设计一个类&#xff0c;不能被拷贝 C98 C11 2.设计一个类&#xff0c;只能在堆上…

echarts制作多个纵轴的折线图

代码 <script type"text/javascript"> $(function (){var myChart echarts.init(document.getElementById(main));option {color: ["#9bbb59","#0B438B","#4141F1","#F81945","#4bacc6","#F89E19&q…

Python 电商API 开发最佳实践

一、简介 当你打卡了一家北京最具有地中海特色的餐厅&#xff0c;当我们在餐厅点餐时&#xff0c;服务员会给我们一份菜单&#xff0c;菜单上列出了所有可供选择的菜品和饮料。我们可以在菜单上选择我们想要的食物和饮料&#xff0c;然后告诉服务员我们的选择。服务员会根据我…

soft ip与hard ip

ip分soft和hard两种&#xff0c;soft就是纯代码&#xff0c;买过来要自己综合自己pr。hard ip如mem和analog与工艺有关。 mem的lib和lef是memory compiler产生的&#xff0c;基于bitcell&#xff0c;是foundry给的。 我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起…

数学建模专栏简介

&#x1f64c;作者简介&#xff1a;数学与计算机科学学院出身、在职高校高等数学专任教师&#xff0c;分享学习经验、生活、 努力成为像代码一样有逻辑的人&#xff01; &#x1f319;个人主页&#xff1a;阿芒的主页 ⭐ 高等数学专栏介绍&#xff1a;本专栏系统地梳理高等数学…

WebSocket心跳机制

WebSocket是HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术&#xff0c;属于应用层协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。 1、创建webSocket // Create WebSocket connection. const sock…

CountDownLatch和CyclicBarrier学习

CountDownLatch和CyclicBarrier都有一个计数器 CountDownLatch countDownLatch new CountDownLatch(4); CyclicBarrier cyclicBarrier new CyclicBarrier(4) CountDownLatch 是在 countDownLatch.countDown()执行后 4-1 等到4减到0后&#xff0c;就可以继续执行程序&#x…

【如何训练一个中英翻译模型】LSTM机器翻译seq2seq字符编码(一)

系列文章 【如何训练一个中英翻译模型】LSTM机器翻译seq2seq字符编码&#xff08;一&#xff09; 【如何训练一个中英翻译模型】LSTM机器翻译模型训练与保存&#xff08;二&#xff09; 【如何训练一个中英翻译模型】LSTM机器翻译模型部署&#xff08;三&#xff09; 【如何训…