DBus 介绍

article/2025/9/28 0:12:50

一、什么是 DBus?

D-Bus是一个为应用程序间通信的消息总线系统, 用于进程之间的通信。

1.1 三层架构

1、函数库libdbus ------>>>>> 用于两个应用程序互相联系和交互消息。

2、基于 libdbus 构造的消息总线守护进程,可同时与多个应用程序相连,并能把来自一个应用程序的消息路由到0或者多个其他程序。

3、基于特定应用程序框架的封装库或捆绑(wrapper libraries or bindings )。

1.2 高层功能

  • 结构化的名字空间
  • 独立于架构的数据格式
  • 支持消息中的大部分通用数据元素
  • 带有异常处理的通用远程调用接口
  • 支持广播类型的通信

1.3 Bus daemon 总线守护

基于 libdbus 构造的消息总线守护进程,可同时与多个应用程序相连,并能把来自一个应用程序的消息路由到0或者多个其他程序。

从一个进程传递消息给另外一个进程,如果有很多 applications 链接到这个通道上,这个 daemon进程就会把消息转发给这些链接的所有程序。

DBus 是点对点通信,,经过 daemon 抽象后, 并由他寻址和发送消息,每个进程不关心消息发给哪个进程。

发送消息的过程:

第一步:创建和发送消息给后台 bus daemon 进程,这个过程中会有两个上下文的切换

第二步:bus daemon进程会处理该消息,并转发给目标进程,引起上下文的切换目标程序接收到消息。

传递大量的数据,D-Bus不建议,建议共享内存。

二、 介绍

2.1 通讯逻辑图

 

在通讯中分为三种角色,分别为:client、bus daemon 和 server。通讯的过程主要分 client 和 server :

  1. client 需先连接到总线(dbus_bus_get),其次构造消息(dbus_message_new_signal),然后发送消息(dbus_connection_send)到后台进程。后台进程接收消息,然后根据消息类型对消息进行不同处理(bus_dispatch_matches)。
  2. server 接收消息前需要连接到总线,并告知总线需要的消息类型(dbus_bus_add_match),然后等待接收消息(dbus_connection_pop_message)。server 收到总线转发的消息时会根据消息类型,做不同的处理。

2.2 使用案例

2.2.1 clent 发送数据

int main ()

{

GMainLoop *loop; // 定义一个事件循环对象的指针

DBusConnection *bus; // 定义总线连接对象的指针

DBusError error; // 定义D-Bus错误消息对象

loop = g_main_loop_new(NULL, FALSE); // 创建新事件循环对象

dbus_error_init (&error); // 将错误消息对象连接到D-Bus

// 错误消息对象

bus = dbus_bus_get(DBUS_BUS_SESSION, &error);// 连接到总线

if (!bus) {

g_warning("连接到D-Bus失败: %s", error.message); //判断是否连接错误

dbus_error_free(&error); //清除错误消息

return 1;

}

dbus_connection_setup_with_g_main(bus, NULL); // 将总线设为接收GLib事件循环

g_timeout_add(1000, (GSourceFunc)send_ding, bus);

// 每隔1000ms调用一次send_ding()函数

// 将总线指针作为参数

g_main_loop_run(loop); // 启动事件循环

return 0;

}

static gboolean send_ding(DBusConnection *bus) // 定义发送消息函数的细节

{

DBusMessage *message; // 创建消息对象指针

message = dbus_message_new_signal("/com/burtonini/dbus/ding",

"com.burtonini.dbus.Signal",

"ding"); // 创建消息对象并标识路径

dbus_message_append_args(message,

DBUS_TYPE_STRING, "ding!",

DBUS_TYPE_INVALID); //将字符串Ding!定义为消息

dbus_connection_send(bus, message, NULL); // 发送该消息

dbus_message_unref(message); // 释放消息对象

g_print("ding!\n"); // 该函数等同与标准输入输出

return TRUE;

}

2.2.2 server 接收数据

 

int main()

{

GMainLoop *loop; // 定义一个事件循环对象的指针

DBusConnection *bus; // 定义总线连接对象的指针

DBusError error; // 定义D-Bus错误消息对象

loop = g_main_loop_new(NULL, FALSE); // 创建新事件循环对象

dbus_error_init(&error); // 将错误消息对象连接到D-Bus

bus = dbus_bus_get(DBUS_BUS_SESSION, &error); // 连接到总线

if (!bus) { // 判断是否连接错误

g_warning("连接到D-Bus失败: %s", error.message);

dbus_error_free(&error); // 清除错误消息

return 1;

}

dbus_connection_setup_with_g_main(bus, NULL);// 将总线设为接收GLib事件循环

dbus_bus_add_match(bus, "type='signal',interface

='com.burtonini.dbus.Signal'"); // 定义匹配器

dbus_connection_add_filter(bus, signal_filter, loop, NULL); // 调用函数接收消息

g_main_loop_run(loop); // 启动事件循环

return 0;

}

// 定义接收消息函数的细节

static DBusHandlerResult signal_filter(DBusConnection *connection, DBusMessage *message, void *user_data)

{

GMainLoop *loop = user_data; // 定义事件循环对象的指针,并与主函数中的同步

if (dbus_message_is_signal(message, DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL,

"Disconnected")) // 接收连接成功消息,判断是否连接失败

{

g_main_loop_quit (loop); // 退出主循环

return DBUS_HANDLER_RESULT_HANDLED;

}

// 指定消息对象路径,判断是否成功

if (dbus_message_is_signal(message, "com.burtonini.dbus.Signal",

"Ping"))

{

DBusError error; // 定义错误对象

char *s;

dbus_error_init(&error); // 将错误消息对象连接到D-Bus错误

if (dbus_message_get_args(message, &error, DBUS_TYPE_STRING, &s,

DBUS_TYPE_INVALID)) // 接收消息,并判断是否有错误

{

g_print("接收到的消息是: %s\n", s); // 输出接收到的消息

dbus_free (s); // 清除该消息

}

else

{

// 有错误时执行下列语句

g_print("消息已收到,但有错误提示: %s\n", error.message);

dbus_error_free (&error);

}

return DBUS_HANDLER_RESULT_HANDLED;

}

return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;

}

API

void dbus_error_init(DBusError *error);

目的:

参数:

[in]

[out]

过程:

DBusConnection *dbus_bus_get(DBusBusType type, DBusError *error);

目的:

参数:

[in]

[out]

过程:

void dbus_connection_setup_with_g_main (DBusConnection *connection,

GMainContext *context);

目的:

参数:

[in]

[out]

过程:

void dbus_bus_add_match(DBusConnection *connection,

const char *rule,

DBusError *error);

目的:

参数:

[in]

[out]

过程:

dbus_bool_t dbus_connection_add_filter(DBusConnection *connection,

DBusHandleMessageFunction function,

void *user_data,

DBusFreeFunction free_data_function);

目的:

参数:

[in]

[out]

过程:

dbus_bool_t dbus_message_is_signal(DBusMessage *message,

const char *interface,

const char *signal_name);

目的:

参数:

[in]

[out]

过程:

dbus_bool_t dbus_message_get_args(DBusMessage *message,

DBusError *error,

int first_arg_type,

...);

目的:

参数:

[in]

[out]

过程:

DBusMessage* dbus_message_new_signal(const char *path,

const char *interface,

const char *name);

目的:

参数:

[in]

[out]

过程:

dbus_bool_t dbus_message_append_args(DBusMessage *message,

int first_arg_type,

...);

目的:

参数:

[in]

[out]

过程:

dbus_bool_t dbus_connection_send (DBusConnection *connection,

DBusMessage *message,

dbus_uint32_t *client_serial);

目的:

参数:

[in]

[out]

过程:

void dbus_message_unref(DBusMessage *message);

目的:

参数:

[in]

[out]

过程:


http://chatgpt.dhexx.cn/article/mPBABNxZ.shtml

相关文章

【单目标优化算法】蜣螂优化算法(Dung beetle optimizer,DBO)(Matlab代码实现)

👨‍🎓 个人主页: 研学社的博客 💥 💥 💞 💞 欢迎来到本博客 ❤️ ❤️ 💥 💥 🏆 博主优势: 🌞 🌞 🌞博客内容…

算法应用:基于蜣螂优化(DBO)算法的工程优化设计(含MATLAB代码)

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。 这一期是利用蜣螂优化(DBO)算法去求解工程领域中的实际问题。文献[1]设计的DBO算法是202…

智能优化算法(源码)—蜣螂优化算法(Dung beetle optimizer,DBO)

获取更多资讯,赶快关注上面的公众号吧! 文章目录 启发数学模型滚球跳舞繁殖觅食偷窃伪代码 2022年11月27日,东华大学沈波教授团队,继麻雀搜索算法之后,又提出了一种全新的群体智能优化算法——蜣螂优化(Du…

ODB简介

官方参考文档 本文档内容是自己学习的一个记录,内容来自官方文档 https://www.oschina.net/p/odb-orm?hmsraladdin1e1 https://www.codesynthesis.com/products/odb/doc/manual.xhtml#1 ODB是什么? ODB可以直接把C的类对象映像成关系型数据库对象。 …

数据库(DB)

数据库系统概述 数据库:是长期储存在计算机内、有组织的、可共享的大量数据的集合。数据库的基本特征:  数据按一定的数据模型组织、描述和储存  可为各种用户共享、冗余度较小、易扩展  数据独立性较高 数据库管理系统(DBMS&#xff…

SQL server 中的dbo、guest

最近新项目中接触SQL sever 数据库,可视化连接的过程中发现在数据库下存在两个特殊的类似数据库的层级 dbo、guest 查了一下资料这两者的具体含义: dbo database owner 数据库的创建者,创建该对象的用户 DBO是每个数据库的默认用户,具有所有…

SQLServer 对象创建注意事项之dbo

最近,一客户遇到一个奇怪的问题,sqlserver数据库,使用备份恢复到目标机器。之后,在目标服务器创建了测试函数对象,但是执行查询的时候却提示对象不存在,再次尝试重新创建该函数及其依赖的对象时能正常执行。…

单目标优化:蜣螂优化算法(Dung beetle optimizer,DBO)

蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启发所得。 一、蜣螂优化算法 1.1蜣螂滚球 (1)当蜣螂前行无障碍时…

蜣螂优化(DBO)算法(含MATLAB代码)

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年…

智能优化算法 — 蜣螂优化算法(Dung beetle optimizer,DBO)

引言 小时候,蜣螂还是比较多见的,还顽皮地将粪球给它弄走,或者给它来点障碍。现在放牛的几乎看不到了,蜣螂没东西可推了,也慢慢从我们的视线中消失了。 DBO介绍 2022年11月27日,东华大学沈波教授团队&…

什么是 HTTP?

什么是 HTTP? 超文本传输协议 (HTTP) 是万维网的基础,用于通过超文本链接加载网页。HTTP 是应用程序层协议,旨在在联网设备之间传输信息,并在网络协议栈的其他层之上运行。HTTP 上的典型流涉及客户端计算机向服务器发出请求&…

什么是HTTP? HTTP和HTTPS的区别?

目录 1、什么是HTTP? 2、HTTP的特点 ① 支持客户/服务器模式 ② 简单快速 ③ 灵活 ④ 无连接 ⑤ 无状态 3、HTTPS 4、HTTP和HTTPS的区别 ① 安全性不同 ② 默认端口不同 ③ 响应速度和资源消耗不同 ④ 网站申请流程不同 ⑤ 对搜索排名的提升不同 1、什么是H…

什么是HTTPS,与HTTP的区别?

1. 什么是HTTPS HTTPS (Hyper Text Transfer Protocol over SecureSocket Layer),基于安全套接字协议 SSL,是以安全为目标的 HTTP 通道,在 HTTP 的基础上通过传输加密和身份认证保证了传输过程的安全性。 HTTP2.0和H…

什么是 HTTP? HTTP 和 HTTPS 的区别?

简版 http 是无状态的超文本传输协议,连接简单,信息是明文传输,端口为 80。 https 协议是由 httpss 协议构建的可进行加密传输、身份认证的具有安全性网络协议,端口是 443。 优缺点: https 有加密认证相对于 http 安全一些 htt…

什么是https(详细),http和https

文章目录 1:什么是https2:使用http协议的问题2.1:http是明文传输。2.2:http不会验证对方身份。2.3:http无法验证报文的完整性。 3:密钥的问题4:SSL 四次握手4.1:第一次握手4.2&#…

[HTTP] HTTP是什么

HTTP是什么 HTTP是什么 HTTP全称为HyperText Transfer Protocol,被译为超文本传输协议,是互联网上应用最为广泛的一种网络协议。 HTTP协议是在Web上进行数据交换的基础,是一种“客户端–服务器端”协议。也就是说,请求通常是由像浏览器这样…

HTTP 请求是什么?

文章目录 HTTP请求一,请求行二,请求头三,空行四,请求体五,HTTP请求示例 HTTP请求 请求是由客户端向服务器发送的,一般可以分为请求行、请求头、空行和请求体四个部分,如下图所示: …

HTTP 与 HTTPS 的理解

区别:HTTP 是明文传输的,容易泄漏信息,所以大多数应用都会升级为 HTTPS HTTP 底层是用 TCP 传输的,HTTPS 就是在 TCP 和 HTTP 之间加了一层加密和认证的协议,这一层叫做 SSL/TLS。 为什么叫这个名字呢? 因…

什么是HTTP协议、与HTTPS的区别?

一.HTTP协议的定义: http(Hypertext transfer protocol)超文本传输协议,通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定。也就是说,http协议规定了超文本传输所要遵守的规则。…

HTTP和HTTPS

1. 前言 近几年,互联网发生着翻天覆地的变化,尤其是我们一直习以为常的HTTP协议,在逐渐的被HTTPS协议所取代,在浏览器、搜索引擎、CA机构、大型互联网企业的共同促进下,互联网迎来了“HTTPS加密时代”,HTT…