在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

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

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

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

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

2.jpg

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

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

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

環境OK了以后,我們可以就創建第一個HelloWorld工程了,按照如圖所示CommonAPI的工作流程:

2.jpg

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

創建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等。

創建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目錄里,可以看到如下這些生成的代碼文件:

圖片

萬事俱備,可以開發應用程序咯~

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

std::shared_ptr

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

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

HelloWorldStubImpl實現了sayHello接口,正如fidl定義的,當客戶端發送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

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

編譯運行的結果如下:

2.jpg

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

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

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

2.jpg

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

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

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

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

5.HelloWorldStubDefault把參數發給了HelloWorldStubImpl的sayHello。

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

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

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

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

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

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

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

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

審核編輯:劉清

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

    關注

    10

    文章

    362

    瀏覽量

    21583
  • RPC
    RPC
    +關注

    關注

    0

    文章

    111

    瀏覽量

    11536
  • SOA
    SOA
    +關注

    關注

    1

    文章

    288

    瀏覽量

    27475
收藏 人收藏

    評論

    相關推薦

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

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

    一起探索C++的世界!

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

    一起探討一下這個可行?

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

    一起來討論

    一起來討論
    發表于 10-24 10:35

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

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

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

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

    看一下SMART高速計數向導的應用

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

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

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

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

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

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

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

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

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

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

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

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

    電子發燒友網站提供《將Arduino庫與Raspberry Pi Pico C/C++ SDK一起使用.zip》資料免費下載
    發表于 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光纖跳線規格參數你清楚嗎?一起來了解一下

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

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

    今天我們一起來盤點一下CST電磁仿真軟件那些牛叉的求解器??靵頂?b class='flag-5'>一下,你用了里面的幾種
    的頭像 發表于 11-20 10:18 ?6188次閱讀
    盤點<b class='flag-5'>一下</b>CST電磁仿真軟件的求解器
    主站蜘蛛池模板: 国产三a级日本三级日产三级| 午夜小视频网站| 天天插综合| 黄色xxxx| 天堂网2014| 都市激情亚洲综合| 成人在线黄色| 性 色 黄 一级| 丁香花的视频免费观看| 麻豆国产一区二区在线观看| 天天天色综合| 1717国产精品久久| 大喷水吹潮magnet| 亚洲人成www在线播放| 国产在线观看色| a一级日本特黄aaa大片| 五月综合激情网| 在线操| 亚洲一区在线观看视频| 起碰免费视频| 日本特级黄色录像| 在线a网站| 日韩一区二区视频| 一级不卡毛片| 一区二区高清在线| 欧美高清在线播放| 久久久黄色片| 天堂在线www网亚洲| 一级美女视频| 久久精品国产免费中文| 久久精品国产亚洲5555| 2021久久精品国产99国产 | 亚洲国产人久久久成人精品网站| 日本视频www色| 免费观看成人欧美1314www| 性欧美一级| 午夜影视在线视频观看免费| 高h道具触手play肉男男| 国产成人综合一区人人| 亚洲免费观看在线视频| 九色欧美|