基于GDBus技术的IPC通信编程详解(2)

时隔多年,作为2020年的开篇,终于迎来了“基于GDBus技术的IPC通信编程详解(1)”续集——基于GDBus技术的IPC通信编程详解(2)!

第一篇谈到了基于gdbus的IPC的协议接口文档。根据这段时间来的项目经验总结,我们可以定义一个完全通用的协议接口文档。内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<node name="/com/company/project/dbus/s">
  <interface name="com.company.project.dbus.s">
    <method name="SetValue">
                <arg type="i" name="type" direction="in" /> 		<!-- op type -->
                <arg type="s" name="input_array" direction="in" />	<!-- input value array-->
                <arg type="i" name="result" direction="out" />
    </method>
    <method name="GetValue">
                <arg type="i" name="type" direction="in" />             <!-- input op type -->
				<arg type="s" name="input_array" direction="in" />	<!-- input value array-->
                <arg type="s" name="output_array" direction="out" />   <!-- output value array -->
                <arg type="i" name="result" direction="out" />
    </method>
    <signal name="Message">
                <arg type="s" name="message_array" /> 		<!-- message array-->
    </signal>
  </interface>
</node>

对上面的xml稍作解释——客户端调用服务端的method时,传递的参数可归纳为只有2个:type-操作类型;input_array-参数。接口定义文档要做到通用,这个参数就必须为string类型。为什么string类型可以做到通用呢?原因就是——我们可以将所有类型的数据使用json转换成字串类型,这一点灵感来自网络通信。

有了json的加持,我们采用dbus通信就非常方便了,开发人员在调试、改变接口时,不再需要重新生成协议源码文件,只需要修改代码即可;另外,使用dbus-monitor工具时,也能使用字串调试。相比QDBus中的QVariant类型、Glib中的GVariant类型,调试方便得很了。

C++封装的开源json代码,网络上有许多。如果觉得找起来麻烦的,可以私信我。

比如,客户端要调用setvalue接口时,可以这么传递参数:

int CServerProxy::SetSomething(int param1,char *param2, int param3)
{
    CJson::CJsonObject ojson;

    ojson.Add("param1", param1);
    ojson.Add("param2", param2);
    ojson.Add("param3", param3);

    int ret = setvalue(somte_type, ojson.ToString().c_str());//这个是GDBus根据xml生产的接口函数

    return ret;
}

服务端发到客户端的消息,也是json字串,可以通过下面的方式进行数据解析:

void CServerProxy::OnMessage(const char* msg)
{
    int param1,param3;
    string param2;

    string message = msg;

    CJson::CJsonObject ojson( message );

    ojson.Get("param1", param1);
    ojson.Get("param2", param2);
    ojson.Get("param3", param3);
}

切记,在封装和解析服务端和客户端的参数时,务必要保证参数原始数据的类型一一对应。

至此,基于GDBus的通用协议架构完结了。后续还会跟进一步写dbus相关的东西。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值