基於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相關的東西。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章