时隔多年,作为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相关的东西。