0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一起看一下CommonAPI C++是怎么使用的吧

冬至子 ? 來源:拖拉機日記 ? 作者:活到一百歲 ? 2023-01-18 16:34 ? 次閱讀

我們已經可以基于vsomeip實現(xiàn)SOME/IP應用,并且服務端和客戶端之間進行消息的通信,消息的內容稱為Payload
但是設想一下,如果當我們需要傳遞的消息內容是一個比較復雜的數(shù)據結構,比如一個結構體,一兩個倒也沒事,多了以后,Payload的打包、解析和聯(lián)調都會是件麻煩的事。

這時,我們會想到序列化,比如用Google Protocol Buffer之類的,是不是可以解決問題呢?

對于非AUTOSAR設備之間的通信,是可以解決的,但對于與AUTOSAR設備之間的通信,恐怕就行不通了,因為Payload是需要遵循AUTOSAR規(guī)范的,如圖:

2.jpg

于是,我們又會想到,如果有人能把序列化這一步也幫我們做好那就更好了,這就是RPC(Remote Procedure Call,遠程過程調用)可以做到的事了。

GENIVI的CommonAPI C++是基于vsomeip實現(xiàn)的RPC框架,今天就讓我們一起看一下它是怎么用的吧~

搭建CommonAPI的開發(fā)環(huán)境,有點費勁的,除了依賴于boost和vsomeip,還有CommonAPI和CommonAPI-SomeIP,以及C++代碼生成工具,這里就不一一說明了,我已經整理好,放在Github上,關注公眾號,回復“演示代碼”,可以獲得項目鏈接。

環(huán)境OK了以后,我們可以就創(chuàng)建第一個HelloWorld工程了,按照如圖所示CommonAPI的工作流程:

2.jpg

其中,F(xiàn)rancaIDL是一種接口描述語言,和編程語言無關。fidl文件是用IDL寫的,它描述了服務提供的接口信息,包括類型(比如method、broadcast、attribute等)、參數(shù)、返回值。

創(chuàng)建HelloWorld.fidl文件:

package commonapi


interface HelloWorld {
  version {major 1 minor 0}
  method sayHello {
    in {
      String name
    }
    out {
      String message
    }
  }
}

fdepl文件描述了服務的部署信息,包括Service ID、Instance ID、Method ID、Event ID等。

創(chuàng)建HelloWorld.fdepl文件:

import "platform:/plugin/org.genivi.commonapi.someip/deployment/CommonAPI-SOMEIP_deployment_spec.fdepl"
import "HelloWorld.fidl"


define org.genivi.commonapi.someip.deployment for interface commonapi.HelloWorld {
  SomeIpServiceID = 4660


  method sayHello {
    SomeIpMethodID = 123
  }
}


define org.genivi.commonapi.someip.deployment for provider as MyService {
  instance commonapi.HelloWorld {
    InstanceId = "test"
    SomeIpInstanceID = 22136
  }
}

CommonAPI代碼生成工具幾乎支持Franca的全部功能。

用準備好的工具生成代碼:

commonapi-core-generator-linux-x86_64 -sk ./fidl/HelloWorld.fidl
commonapi-someip-generator-linux-x86_64 ./fidl/HelloWorld.fdepl

在src-gen/v1/commonapi目錄里,可以看到如下這些生成的代碼文件:

圖片

萬事俱備,可以開發(fā)應用程序咯~

對于服務端,主程序代碼如下:

std::shared_ptr

其中,HelloWorldStubImpl是繼承于工具生成的HelloWorldStubDefault:

class HelloWorldStubImpl: public v1_0::commonapi::HelloWorldStubDefault {
public:
    HelloWorldStubImpl();
    virtual ~HelloWorldStubImpl();
    virtual void sayHello(const std::shared_ptr;
};

HelloWorldStubImpl實現(xiàn)了sayHello接口,正如fidl定義的,當客戶端發(fā)送name,回復“Hello name !”:

void HelloWorldStubImpl::sayHello(const std::shared_ptr
{
    std::stringstream messageStream;
    messageStream << "Hello " << _name << "!";
    std::cout << "sayHello('" << _name << "'): '" << messageStream.str() << "'\\n";
    _reply(messageStream.str());
};

對于客戶端,主程序如下:

std::shared_ptr < CommonAPI::Runtime > runtime = CommonAPI::Runtime::get();
std::shared_ptr

客戶端不需要實現(xiàn)接口,直接使用工具生成的HelloWorldProxy就可以了。

編譯運行的結果如下:

2.jpg

現(xiàn)在再看一下應該選擇CommonAPI還是vsomeip呢?用vsomeip的話,依賴的東西少,Payload的打包和解析要自己寫,工作量大,自由發(fā)揮的空間也大,用CommonAPI的話,依賴的東西多,環(huán)境搭建相對復雜,接口可以用IDL描述,這在SOA中非常有用,很多代碼由工具生成,基本通信幾乎不需要聯(lián)調,主要的開發(fā)工作是實現(xiàn)服務的接口,相當于填充業(yè)務邏輯,工作量少,同時可以發(fā)揮的空間也小。很多事都是這樣吧,獲得便利的同時也會損失一些自由,如何選擇還是要具體分析。

通過這個示例,我們看到使用RPC通信和上一篇中基于消息的通信是截然不同的編程體驗,RPC讓客戶端可以像調用本地函數(shù)一樣調用服務端的函數(shù),很顯然它們并不在同一個進程中,這是如何做到的呢?

下面,我們結合一張經典的RPC原理框圖來看一下客戶端的sayHello到底是怎么調到服務端的sayHello的:

2.jpg

1.client調用本地接口sayHello,HelloWorldProxy就是client的stub(樁),負責將sayHello的參數(shù)進行打包,組裝成一個或者多個網絡請求(這些取決于通信協(xié)議和序列化方式);

2.client的stub通過socket向server的stub,也叫skeleton(骨架),發(fā)送請求;

3.skeleton通過socket接收到請求;

4.請求消息被發(fā)送到skeleton,在這里就是HelloWorldStubDefault,負責將收到的請求拆包,取得client發(fā)送的參數(shù);

5.HelloWorldStubDefault把參數(shù)發(fā)給了HelloWorldStubImpl的sayHello。

6.server在HelloWorldStubImpl的sayHello里處理了請求,通過sayHelloReply_t將返回值發(fā)給了HelloWorldStubDefault,它負責把返回值進行打包,組裝成一個或者多個網絡響應;

7.server的skeleton通過socket向client的stub發(fā)出響應;

8.stub通過socket接收到響應消息;

9.響應消息被發(fā)送到client的stub,也就是HelloWorldProxy,它負責將響應消息進行解析,取得server發(fā)送的參數(shù);

10.client通過HelloWorldProxy的sayHello,得到了returnMessage。

至此,client完成了一次RPC調用~

可以看出,在RPC框架中,樁的實現(xiàn)原理是非常關鍵的,它屏蔽了網絡通信的實現(xiàn),讓客戶端可以像調用本地接口一樣調用服務端提供的接口,而不用關心用的什么通信協(xié)議、序列化方式,以及所有的通信細節(jié)。

CommonAPI的樁是由代碼生成器根據IDL生成的,而在有的RPC框架里,還可以用動態(tài)代理的方式得到。

審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • AUTOSAR
    +關注

    關注

    10

    文章

    363

    瀏覽量

    21639
  • RPC
    RPC
    +關注

    關注

    0

    文章

    111

    瀏覽量

    11542
  • SOA
    SOA
    +關注

    關注

    1

    文章

    292

    瀏覽量

    27525
收藏 人收藏

    評論

    相關推薦

    看一下射頻電路中的那些無源器件

    今天我們一起來看一下射頻電路中的那些無源器件。和數(shù)字和低頻電路類似,射頻電路也分為無源器件和有源器件
    發(fā)表于 10-08 16:03 ?873次閱讀
    <b class='flag-5'>看一下</b>射頻電路中的那些無源器件

    一起探索C++的世界!

    C++
    YS YYDS
    發(fā)布于 :2023年07月07日 19:10:25

    一起探討一下這個可行?

    電子元器件、打板PCB、一起探討等等,既可以省錢也可以交到有想法有創(chuàng)意的朋友,供電子DIY愛好者方便DIY。歡迎各位壇友一起討論一下,盡可能的提出各種問題,待時機成熟時一起DIY幾個創(chuàng)
    發(fā)表于 05-30 21:26

    一起來討論

    一起來討論
    發(fā)表于 10-24 10:35

    SPC560Bxx OSAL組件不能與C++一起使用

    'SPC560Bxx OSAL組件RLA'1.0.201704140929不能與C ++一起使用,因為在osal.h和systimer.h中沒有關閉extern'C'-block
    發(fā)表于 05-17 07:48

    C++軟件設計基礎考試題庫快來復習一下

    本文檔的主要內容詳細介紹的是C++軟件設計基礎考試題庫快來復習一下!
    發(fā)表于 09-28 16:36 ?12次下載

    看一下SMART高速計數(shù)向導的應用

    SMART不僅支持利用指令編寫高速計數(shù)程序的功能,還提供了便捷的高速計數(shù)向導功能,只需要簡單組態(tài)就可以自動生成程序,而且程序未進行加密,生成后可以修改。下面一起來看一下向導如何組態(tài)
    的頭像 發(fā)表于 11-20 15:30 ?3427次閱讀

    一起來看一下藍牙版本到現(xiàn)在都經歷了哪些變化

    隨著藍牙產品,藍牙BQB認證的持續(xù)火熱,藍牙版本也在直的更新?lián)Q代。藍牙的技術在飛速的進步,在方便了我們的生活的同時,也讓很多生產帶有藍牙設備的廠商獲得了收益。 今天微測檢測就來帶大家看一下藍牙
    發(fā)表于 03-17 15:41 ?5399次閱讀

    今天我們大家一起來探討一下關于PCBA生產中的問題

    今年這個春節(jié)加上疫情在家差不多待了兩個月,也思考樂很多問題,今天我匯總了一下,我們大家一起動動聰明的腦袋瓜,讓我們一起來思考和總結一下PC
    發(fā)表于 03-25 14:23 ?1232次閱讀

    今天我們大家一起來探討一下關于PCBA生產中的問題

    今年這個春節(jié)加上疫情在家差不多待了兩個月,也思考樂很多問題,今天我匯總了一下,我們大家一起動動聰明的腦袋瓜,讓我們一起來思考和總結一下PC
    發(fā)表于 03-27 14:29 ?877次閱讀

    帶大家一起體驗一下Vivado的ECO流程

    這里帶大家一起體驗一下Vivado 的ECO流程,以vivado自帶的Example Design為例, 直接用TCL命令修改網表,在正常的寄存器路徑之間加級LUT。
    的頭像 發(fā)表于 11-29 11:04 ?4397次閱讀
    帶大家<b class='flag-5'>一起</b>體驗<b class='flag-5'>一下</b>Vivado的ECO流程

    34種自動控制原理圖展示,了解一下

    各類電氣控制接線圖、電子元件工作原理圖,還有可控硅整流電路及負反饋調速裝置原理等等,希望對大家的工作有所幫助,一起來了解一下。
    的頭像 發(fā)表于 07-05 11:16 ?9255次閱讀
    34種自動控制原理圖展示,了解<b class='flag-5'>一下</b><b class='flag-5'>吧</b>

    將Arduino庫與Raspberry Pi Pico C/C++ SDK一起使用

    電子發(fā)燒友網站提供《將Arduino庫與Raspberry Pi Pico C/C++ SDK一起使用.zip》資料免費下載
    發(fā)表于 06-15 14:43 ?1次下載
    將Arduino庫與Raspberry Pi Pico <b class='flag-5'>C</b>/<b class='flag-5'>C++</b> SDK<b class='flag-5'>一起</b>使用

    mpo光纖跳線規(guī)格參數(shù)你清楚嗎?一起來了解一下

    來了解一下。 mpo光纖跳線規(guī)格參數(shù): 適用連接器類型 MPO端:MPO或MTP;分支端連接器:FC、LC、SC、ST(客戶選擇) 光纖類型 單模 多模(PC) 工作波長范圍 1250~1650nm
    的頭像 發(fā)表于 06-28 11:23 ?1967次閱讀
    mpo光纖跳線規(guī)格參數(shù)你清楚嗎?<b class='flag-5'>一起</b>來了解<b class='flag-5'>一下</b><b class='flag-5'>吧</b>

    盤點一下CST電磁仿真軟件的求解器

    今天我們一起來盤點一下CST電磁仿真軟件那些牛叉的求解器。快來數(shù)一下,你用了里面的幾種!
    的頭像 發(fā)表于 11-20 10:18 ?6281次閱讀
    盤點<b class='flag-5'>一下</b>CST電磁仿真軟件的求解器