如何高效的利用dbus做client-server架构

2023-11-21 18:38
文章标签 高效 架构 server client dbus

本文主要是介绍如何高效的利用dbus做client-server架构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在嵌入式系统中利用dbus重要有两个方面的用处:
1:历程间通信
2:告终client/server形式;

2也是1的翔实出现形式;

包括dbus自带的例子,都是批准dbus对数据的封装,告终client/server形式的,
缺点有二:
1 一个API要定义一个xml接口描写
2 数据封装极其混杂,极其不利于尔后接口的伸展;

为了客服上面的缺点,长进可伸展性和效率,能够这么做:
万一一个利用分为client,server两端的话,要高效率的告终client/server之间
的通信,能够批准如下措施:


第一步:定义一个通用的API xml 接口描写,暂号召为dbus_general.xml

<?xml version="1.0" encoding="UTF-8" ?>
<node name="/org/freedesktop/DBus/General_api">
<inte***ce name="org.freedesktop.DBus.general_api">
<method name="client_request">
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="__client_request_cb"/>
<arg type="i" name="action_id" direction="in" />//这个地方即便不同API的ID
<arg type="i" name="input_int" direction="in" />//这个参数能够用www.zhuangyuan.org,也能够无须
<arg type="ay" name="input_garray" direction="in" />//这个Garray用来从client递交数据,包括混杂的数据构造到server
<arg type="i" name="outut_int" direction="out" />//这个能够用,也能够无须
<arg type="ay" name="output_garray" direction="out" />//这个Garray用来从server侧传回数据到client侧
<arg type="i" name="result" direction="out" />
</method>
</inte***ce>
</node>

大家懂得:在dbus文档中有这么的描写,

ay | Array of bytes | DBUS_TYPE_G_BYTE_ARRAY | GArray * |g_array_free

大家都不常用字节数组(GArray),大家常用的是integar,string等;
这个通用的模板关键之处即便这个Garray, Garray本身是个容器,这个
容器里面能够装任何东西。

我们即方便用这个GArray来告终client与server之间数据的递交,无论想递交
什么要的数据;


第二步:用dbus的工具函数生成stub/proxy头文件,这一步写到Makefile脚本中,尔后无须修正了;

dbus-binding-tool --mode=glib-server --prefix=your_module_name dbus_general.xml > general_stub.h
dbus-binding-tool --mode=glib-client --prefix=your_module_name dbus_general.xml > general_proxy.h

生成的头文件,大家等闲不要动它们,直接利用就能够了;

general_proxy.h:

.....
client_request (DBusGProxy *proxy, const gint IN_action_id, const gint IN_input_int, const GArray* IN_input_garray, gint* OUT_output_int, GArray** OUT_output_garray, gint* OUT_result, GError **error)

{
return dbus_g_proxy_call (proxy, "request", error, G_TYPE_INT, IN_action_id, G_TYPE_INT, IN_input_int, dbus_g_type_get_collection ("GArray", G_TYPE_UCHAR), IN_input_garray, G_TYPE_INVALID, G_TYPE_INT, OUT_output_int, dbus_g_type_get_collection ("GArray", G_TYPE_UCHAR), OUT_output_garray, G_TYPE_INT, OUT_result, G_TYPE_INVALID);
}
.....

general_stub.h:
.....

#include <dbus/dbus-glib.h>
static const DBusGMethodInfo dbus_glib_your_module_name_methods[] = {
{ (GCallback) __client_request_cb, dbus_glib_marshal_your_module_name_BOOLEAN__INT_INT_BOXED_POINTER_POINTER_POINTER_POINTER, 0 },
};

const DBusGObjectInfo dbus_glib_your_module_name_object_info = {
0,
dbus_glib_your_module_name_methods,
1,
"org.freedesktop.DBus.general_api/0client_request/0S/0action_id/0I/0i/0input_int/0I/0i/0input_garray/0I/0ay/0output_int/0O/0F/0N/0i/0output_garray/0O/0F/0N/0ay/0result/0O/0F/0N/0i/0/0/0",
"/0",
"/0"
};
......

第三步:告终client侧,重要是直接调用general_proxy.h的接口函数client_request(),用GArray传入你的数组(能够携带任何你自己定义的数据构造)

gboolean proxy_func1 (void)
{
intapi_id = 0; //这个在不同的proxy_func里面能够有不同的值,重要是判别函数作用
GArray*in_array = NULL;
GArray*out_array = NULL;//在这里无须分配内存,放在server侧做内存分配

in_array = g_array_new(FALSE, FALSE, sizeof(guint8));
if (!in_array)
return FALSE;

//把你自己的数据封装到in_array中,假想你的数据构造是your_strcut_t

your_struct_t my_own_data;

//fill my_own_data
...

//放到in_array中,这很关键
g_array_append_vals(in_array66.syxinhao.com, my_own_data, sizeof(your_strcut_t));

//调用general_proxy.h中的dbus接口
client_request(dbus_proxy, api_id, in_array, &out_array, .....); //穿越dbus把数据从到server侧,server侧如何处理,看第四步;

//当sever归来数据后,从out_array中取出来就能够了
your_strcut_t* g_array_data = (your_strcut_t*)out_array->data;
.....

//free
if (in_array)
g_free (in_array);

if (out_array)
g_free (out_array);

....
}


第四步:告终Server侧,重要是告终general_stub.h中的函数__client_request_cb();

//这个函数的参数很长,除非第一个参数是server对象外,其他的参数能够直接从
general_proxy.h对应的接口参数拷贝到来;该当这个函数和proxy的接口是一对!欧姆龙电子血压计

gboolean
__client_request_cb (ServerObject *server_object, const gint IN_action_id, const gint IN_input_int, const GArray* IN_input_garray, gint* OUT_output_int, GArray** OUT_output_garray, gint* OUT_result, GError **error)
{
*OUT_output_garray = g_array_new(FALSE, FALSE, sizeof(guint8));//在client侧未曾分配内存,server这里定然要分配

//卸下client侧递交到来的数据
your_strcut_t ×p_data= (your_strcut_t *)&g_array_index(input_garray,your_strcut_t, 0);

//对卸下的数据举行处理,看你的过程做什么功能了:)
.....
.....

//万一要传回数据到client侧,假想处理过的数据为:your_strcut_t dealed_with_data
g_array_append_vals(*output_garray, &dealed_with_data, sizeof(your_strcut_t));


return TRUE;//定然要归来TRUE,否则client侧收不到数据的;

}


上述通用环节中,1,2在尔后的伸展中,是不要要改的,尤其是第一步,dbus的xml接口描写极其
繁琐;万一为每个API自己去定义xml接口描写,搞不好,client和server之间不通;而且,一段工夫
后,不看dbus的文档,就会淡忘如何写其xml接口;因而做个通用的xml接口描写很省事;

3,4是client/server侧的各自告终,构造是钉死的,无须改多少;一个函数如此,N个函数也是这么;
万一你有30个函数,要离别告终它们吗?无须要,凡是给各自的函数定义其ID就行;
在client/server侧的函数里面搞个switch-case构造就离别了;

架构定好了,递交数据也极其得体,比dbus自己的dbus_g_type_struct_set效率高的多,现在开源软件
多用dbus_g_type_struct_set,效率很低,对于递交批量数据,效率很低;

万一大家对于如何长进dbus递交消息/数据的效率,有什么更好的见解,迎接沟通。


参看:
一位网友写的dbus的基础的利用,写的不错,大家能够参看:
http://blog.csdn.net/yuhang111/archive/2007/08/27/1760141.aspx

另外,dbus的起源在:
http://www.freedesktop.org/wiki/Software/dbus,这里是dbus project的宿主地址,
其官方文档都在这里,大家有空看看;

这篇关于如何高效的利用dbus做client-server架构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/404276

相关文章

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者