時隔多年,作爲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相關的東西。