【Qt高阶】Qt D-Bus 简介【2023.10.16】

news2024/11/25 13:04:53

Qt D-Bus介绍

  • 简介
    • 总线
    • 技术名词
      • 消息(阐述总线的消息内涵)
      • 服务名
      • 对象路径
      • 接口
      • 备忘表(便于记住名字的格式)
      • 调试
  • 麒麟V10 与D-Bus

在这里插入图片描述

简介

  D-Bus 是一个进程间通信(IPC)和远程过程调用(RPC)机制,最初是为了 Linux 开发,用来取代现有的竞争的 IPC 解决方案,提供一个统一的协议。它也被设计来允许系统级进程(比如打印机和硬件驱动程序服务)和普通用户进程之间的通信。
  它使用一个快速的二进制消息传递协议,适合在同一台机器上的通信,因为其低延迟和低开销。其规范当前由 freedesktop.org 项目定义,并向所有方开放。
  通信通常是通过一个中心的服务器应用程序,称为“总线”(因此得名),但是应用程序之间的直接通信也是可能的。在总线上通信时,应用程序可以查询其他可用的应用程序和服务,也可以按需激活一个。

总线

  D-Bus 总线用于需要多对多通信的场景。为了实现这一点,在任何应用程序连接到总线之前,都需要启动一个中心服务器:这个服务器负责跟踪已连接的应用程序,并正确将消息从源路由到目的地。
  此外,D-Bus 定义了两个众所周知的总线,称为系统总线和会话总线。这些总线的特殊之处在于它们有明确定义的语义:一些服务被定义为可以在这两个总线中的一个或两个总线中找到。
  例如,一个想要查询连接到计算机的硬件设备列表的应用程序,可能会与系统总线上提供的一个服务进行通信,而提供打开用户浏览器的服务可能会在会话总线上找到。
  在系统总线上,也可以期望找到对每个应用程序允许提供的服务的限制。因此,可以合理确定,如果某个服务存在,它是被一个可信的应用程序提供的。

技术名词

消息(阐述总线的消息内涵)

  在底层,应用程序通过向彼此发送消息在D-Bus上进行通信。消息被用来传递远程过程调用以及与之相关的回复和错误。当在总线上使用时,消息具有一个目的地,这意味着它们仅被路由到感兴趣的各方,避免了由“蜂拥”或广播引起的拥塞。
  一种特殊的称为“信号消息”的消息(这个概念基于Qt的信号和槽机制),然而,没有预定义的目的地。由于其目的是在一对多的上下文中使用,因此信号消息被设计为在“按需选择”机制上工作。
  Qt D-Bus模块将底层的消息概念完全封装成了一种更简单的、面向Qt开发者熟悉的面向对象的方式。在大多数情况下,开发者不必担心发送或接收消息。
  它通过信号和槽以及调用远程接口的方法来抽象底层的D-Bus消息传递,使开发者可以更轻松地使用D-Bus的IPC功能,而不需要关注底层的消息发送和接收。

服务名

  在总线上进行通信时,应用程序会获取所谓的“服务名称”:这是应用程序选择在同一总线上的其他应用程序中所知道的名称。服务名称由 D-Bus 总线守护进程进行管理,并用于在一个应用程序与另一个应用程序之间路由消息。一个类似服务名称的概念是 IP 地址和主机名:一台计算机通常有一个 IP 地址,并且根据它向网络提供的服务,可能关联有一个或多个主机名。
  另一方面,如果不使用总线,也就不会使用服务名称。如果我们再次拿计算机网络进行比较,这相当于点对点网络:由于对端是已知的,因此不需要使用主机名来查找它或它的 IP 地址。
  D-Bus 服务名称的格式实际上与主机名非常相似:它是一个由字母和数字组成的以点分隔的序列。常见的做法是根据定义该服务的组织的域名来命名服务名称。
  例如,D-Bus 服务是由 freedesktop.org 定义的,可以在总线上以服务名称 org.freedesktop.DBus 找到。
  所以在 D-Bus 中服务名称和 IP 地址/主机名类似,用于标识提供服务的应用程序。选择一个合理的服务名称有助于组织和管理 D-Bus 上的服务。

org.freedesktop.DBus

对象路径

  像网络主机一样,应用程序通过导出对象为其他应用程序提供特定的服务。这些对象以层次结构组织,非常类似于从QObject派生的类所具有的父子关系。然而,有一个不同之处是,存在“根对象”的概念,所有的对象都将其作为最终父对象。
  如果我们继续 Web 服务的类比,对象路径相当于 URL 的路径部分:
例如,在 Web 中,路径 /users/12345 标识一个特定的用户资源。在 D-Bus 中,对象路径也以相似的方式标识对象。
   像文件系统中的路径名一样,D-Bus 中的对象路径由斜杠分隔的标签组成,每个标签由字母、数字和下划线字符(“_”)组成。对象路径必须以斜杠开头,且不能以斜杠结尾。

接口

  接口类似于C++抽象类和Java的接口关键字,并声明在调用者和被调用者之间建立的“契约”。,也就是说,它们建立了可用的方法、信号和属性的名称,以及在建立通信时从任何一方所期望的行为。
  Qt在其插件系统中使用了一个非常类似的机制:C++中的基类通过Q_DECLARE_INTERFACE()宏与唯一标识符相关联。
  事实上,D-Bus接口名称的命名方式类似于Qt插件系统所建议的方式:通常由定义该接口的实体的域名构造的标识符。

备忘表(便于记住名字的格式)

服务名类比于名字格式
服务名网络主机名点分割,看起来像一个主机名
对象路径URL路径斜杠分割,看起来像个路径
接口插件id点分割

调试

  在开发使用D-Bus的应用程序时,能够看到每个应用程序通过总线发送和接收的消息的相关信息有时会非常有用。
  这个功能可以通过在运行每个应用程序之前设置QDBUS_DEBUG环境变量来针对每个应用程序启用。例如,我们可以只为D-Bus远程控制汽车示例中的汽车启用调试,通过以下方式运行控制器和汽车:

examples/dbus/remotecontrolledcar/controller/controller &
QDBUS_DEBUG=1 examples/dbus/remotecontrolledcar/car/car &

信息会直接打印到启动程序的控制台。

麒麟V10 与D-Bus

  麒麟V10 会用到D-Bus,而且用的比较重。我自己试了直接把 下图的678进程杀掉,系统直接黑屏。
在这里插入图片描述

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

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

相关文章

交通部 EDI是什么?如何处理?

交通部于1996年开始实施《国际集装箱运输电子信息传输和运作系统及示范工程》,即在中国远洋运输集团、上海口岸、宁波口岸、天津口岸和青岛口岸建立 EDI 示范工程。 交通部 EDI 的数据结构 电子口岸或者其他物流企业需要确保能够生成和解析符合交通部要求的EDI数据…

两个pdf合并成一个pdf?

两个pdf合并成一个pdf?pdf合并是我们在处理PDF中非常常见的一个操作。我们看似有很多方法能够实现这一操作,但是真正适合自己的方法确实能够帮助我们很多。那么多方法的话,小编今天打算汇总几个比较适合新手的快速方法,这样效率更…

建立线上线下一体化营销体系,数字化营销系统必不可少

​在当今的市场环境中,实体行业想要取得持续的收入增长,必须将线上线下业务相结合,充分利用数字化营销系统的功能,以构建“全链路式”数字化营销体系。 而数字化营销系统中,常见的如分销系统、拼团系统、分红系统、积分…

mission planner通过串口连接3DR数传,远程飞控

前提 pixhaw2.4.8已布线,有单独的电源供电,通过电量计接power接口 电量计的输入端接24V电源,飞控的输入是5v电源,电量计上有个模块可以分压将5v的电输入到飞控 数传接在接口telem 2上(一个接飞控,一个接电…

用浏览器进行web应用测试,你会怎么做?

有没有遇到这样的一个场景:你在使用浏览器进行web应用测试,但是你想知道你在测试过程中的前端输出和后端响应的情况究竟如何。那么,你会怎么做呢?想必大多人会毫不犹豫地回答:通过浏览器console面板和network面板抓取信…

idea使用debug无法启动,使用run可以启动

1、将调试断点清除 使用快捷键ctrl shift F8,将勾选的选项去除即可 2、Error running SampleApplication: Command line is too long. Shorten command line for SampleApplication or also for Spring Boot default configuration,报这种错误&#x…

信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(五):有损传输线的特性阻抗和信号传输速度

有损传输线的特性阻抗 理想有损传输线特性阻抗是和频率相关的,很复杂。可以有以下公式: 按照代数知识,特性阻抗的实部和虚部如下: 其中RL表示单位长度导体的串联电阻 CL表示单位长度电容 LL单位长度串联环路电感 GL电介质单位长度…

番茄小说推文怎么申请授权?

以下为申请步骤 1.使用“巨量推文” 2.找到番茄小说这个小说app 3.按照要求申请关键词 完成以上步骤即可申请番茄小说推文关键词授权

前端新特性:Compute Pressure API!!!

前几天,review 同事代码的时候发现了一个新的 JS API PressureObserver。 通过一番搜索,发现这个 API 是 Compute Pressure API 的一部分。 Compute Pressure API:https://www.w3.org/TR/compute-pressure/ 它的作用是可以观察 CPU 的变…

yolov8如何进行训练验证推理

1、新建脚本main.py,也可以建一个yaml文件(避免改到default.yaml),这个yaml文件是在训练时用到 batchsize什么的都可以在yaml文件改,这俩东西不用填 2、两种训练的方法,用的时候可以注释掉其他 from u…

【无标题】三分钟快速实现MQTT网关远程连接三菱系列PLC

MQTT协议网关串口连接三菱FX3UPLC操作说明v1.2 目录 一. 使用流程 二. 准备工作 2.1 需要准备如下物品 2.2 LF220网关准备工作 2.3 PLC准备工作 2.4 电脑的准备工作 2.5 MQTT服务器准备工作 三. 腾讯云平台配置步骤 3.1 创建产品 3.2 添加设备 3.3 获取…

Python 中的变量Variable

六、Python 中的变量 1、变量的创建和赋值 在 Python 程序中,变量是用一个变量名表示,可以是任意数据类型,变量名必须是大小写英文、数字和下划线(_)的组合,且不能用数字开头,比如: a=88这里的 a 就是一个变量,代表一个整数,注意一点是 Python 是不用声明数据类型…

h5端自动滑动轮播效果实现

一、客户需要的效果图 二、具体代码实现如下&#xff1a; dom:<div class"swiper-container"> <div class"swiper-wrapper ul" click"setInputText"> <div class"swiper-slide li" v-for"(item, index) in answe…

如何使用内网穿透实现U8用友ERP本地部署并远程访问办公?

文章目录 前言1. 服务器本机安装U8并调试设置2. 用友U8借助cpolar实现企业远程办公2.1 在被控端电脑上&#xff0c;点击开始菜单栏&#xff0c;打开设置——系统2.2 找到远程桌面2.3 启用远程桌面 3. 安装cpolar内网穿透3.1 注册cpolar账号3.2 下载cpolar客户端 4. 获取远程桌面…

HarmonyOS/OpenHarmony原生应用开发-华为Serverless服务支持情况(四)

文档中的TS作者认为就是ArkTS之意。 一、云存储 AppGallery Connect&#xff08;简称AGC&#xff09;云存储是一种可伸缩、免维护的云端存储服务&#xff0c;可用于存储图片、音频、视频或其他由用户生成的内容。借助云存储服务&#xff0c;您可以无需关心存储服务器的开发、…

尾菜变宝、苹果富硒:青年学子秀农研成果 拼多多以赛促研助乡村振兴

青年兴则国兴&#xff0c;青年强则国强。一批新时代中国青年&#xff0c;仍保持着“自找苦吃”的精气神&#xff0c;冬天凿冰、夏天抗暑&#xff0c;以科技小院为依托&#xff0c;在服务三农建设中“解民生、治学问”。 10月14日&#xff0c;“中国研究生乡村振兴科技强农创新…

如何把视频压缩变小?

如何把视频压缩变小&#xff1f;大家都知道&#xff0c;视频一般都伴随着很大的文件体积&#xff0c;&#xff1a;尤其是现在的视频大多是高清晰度的&#xff0c;因此视频文件的体积就更加的大&#xff0c;视频体积太大会给我们带来很多的不便&#xff0c;主要是以下这几点&…

【Linux】Ubuntu美化bash【教程】

【Linux】Ubuntu美化bash【教程】 文章目录 【Linux】Ubuntu美化bash【教程】1. 查看当前环境中是否有bash2. 安装Synth-Shell3. 配置Synth-Shell4. 取消greeterReference 1. 查看当前环境中是否有bash 查看当前使用的bash echo $SHELL如下所示 sjhsjhR9000X:~$ echo $SHELL…

8、docker 安装 nginx

1、下载镜像 docker pull nginx 2、本机创建目录 1&#xff09;创建nginx挂载目录 mkdir /usr/local/nginx 2&#xff09;进入nginx目录 cd /usr/local/nginx 3&#xff09;创建 www和logs目录 mkdir -p www logs 3、创建nginx容器 此容器用于复制配置文件&#xff0c;复…

Unity中Shader的深度写入ZWrite

文章目录 前言一、更新深度缓冲区中值二、深度值的写入操作只有两个选择 开启 和 关闭ZWrite OnZWrite Off 三、深度写入在半透明物体物体中开启的情况1、特效一般都需要关闭深度写入2、如果在人物模型上使用 特效半透明 的 Shader&#xff0c;为了不出现模型自身穿透问题&…