在說vsomeip之前,先介紹一下它的貢獻(xiàn)者——GENIVI,是一個(gè)非營(yíng)利汽車行業(yè)聯(lián)盟。這個(gè)聯(lián)盟成立于2009年,已經(jīng)成功地完成了最初的使命,提供了一個(gè)開放的、基于linux的車載信息娛樂(IVI)平臺(tái),并擴(kuò)大了其范圍,幫助汽車制造商及其供應(yīng)商開發(fā)標(biāo)準(zhǔn)方法。
在汽車行業(yè),GENIVI的項(xiàng)目被非常廣泛地應(yīng)用,比如:vsomeip,CommonAPI C++,DLT…沒見用過的就不列出來了,感興趣可以到官網(wǎng)了解更多。
vsomeip是一個(gè)開源C++庫(kù),它實(shí)現(xiàn)了SOME/IP協(xié)議棧。接下來,我們通過一個(gè)demo,感受一下SOME/IP的通信過程,以及如何使用vsomeip,廢話不多說,讓我們開始吧~
首先,需要搭建環(huán)境(這里以Ubuntu16.04為例),vsomeip依賴Boost(1.55以上版本),因此我們需要先編譯和安裝Boost:
接著,編譯和安裝vsomeip:
上面這個(gè)配色,著實(shí)讓人匪夷所思(還是我用的有問題?),總之,我不喜歡,所以以后不再插入bash代碼,環(huán)境配置相關(guān)內(nèi)容盡可能寫進(jìn)README里,放到Github上,關(guān)注公眾號(hào),回復(fù)“演示代碼”,就可以看到全部文章里涉及到的工程地址啦~
官方的helloworld,稍微有點(diǎn)簡(jiǎn)單,demo的思路是這樣的:
實(shí)現(xiàn)一個(gè)服務(wù)端,可以:1. 響應(yīng)請(qǐng)求,內(nèi)容為請(qǐng)求的反轉(zhuǎn);2. 觸發(fā)事件
實(shí)現(xiàn)一個(gè)客戶端,可以:1. 發(fā)送請(qǐng)求;2. 訂閱、接收事件
首先,服務(wù)端和客戶端需要約定一些ID,包括:
對(duì)于服務(wù)端,主要代碼如下:
// 創(chuàng)建應(yīng)用對(duì)象
app = vsomeip::runtime::get()->create_application("World");
// 創(chuàng)建事件組,并添加事件組SAMPLE_EVENTGROUP_ID
std::set
其中,請(qǐng)求消息的回調(diào)函數(shù):
void on_message(const std::shared_ptr {
std::shared_ptr
對(duì)于客戶端,主要代碼如下:
// 同樣地,創(chuàng)建應(yīng)用對(duì)象
app = vsomeip::runtime::get()->create_application("Hello");
// 初始化應(yīng)用
app->init();
// 注冊(cè)服務(wù)是否可用的回調(diào)
app->register_availability_handler(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID, on_availability);
// 請(qǐng)求服務(wù)
app->request_service(SAMPLE_SERVICE_ID, SAMPLE_INSTANCE_ID);
// 注冊(cè)接收所有消息的回調(diào)
app->register_message_handler(vsomeip::ANY_SERVICE, vsomeip::ANY_INSTANCE, vsomeip::ANY_METHOD, on_message);
// 發(fā)送請(qǐng)求線程
std::thread sender(run);
// 啟動(dòng)應(yīng)用
app->start();
其中,監(jiān)聽服務(wù)是否可用的回調(diào)函數(shù):
void on_availability(vsomeip::service_t _service, vsomeip::instance_t _instance, bool _is_available) {
std::cout << "CLIENT: Service ["
<< std::setw(4) << std::setfill('0') << std::hex << _service << "." << _instance
<< "] is "
<< (_is_available ? "available." : "NOT available.")
<< std::endl;
// 服務(wù)可用了,可以去發(fā)送請(qǐng)求啦:)
if (_is_available) { condition.notify_one(); }
}
接收所有消息的回調(diào)函數(shù):
void on_message(const std::shared_ptr {
std::stringstream its_message;
its_message << "CLIENT: received a notification for event ["
<< std::setw(4) << std::setfill('0') << std::hex
<< _response->get_service() << "."
<< std::setw(4) << std::setfill('0') << std::hex
<< _response->get_instance() << "."
<< std::setw(4) << std::setfill('0') << std::hex
<< _response->get_method() << "] to Client/Session ["
<< std::setw(4) << std::setfill('0') << std::hex
<< _response->get_client() << "/"
<< std::setw(4) << std::setfill('0') << std::hex
<< _response->get_session()
<< "] = ";
std::shared_ptr
客戶端發(fā)送請(qǐng)求線程函數(shù):
void run() {
std::unique_lock
編譯,運(yùn)行結(jié)果如下:
通過打印出來的日志,我們可以比較清晰地看到整個(gè)通信的過程,并且實(shí)現(xiàn)了預(yù)期的效果。這個(gè)例子只能說明如何快速地上手vsomeip,其實(shí),還有很多東西可以挖掘,比如vsomeip怎么配置,routing manager怎么配置,和dlt怎么聯(lián)動(dòng)等等,真是學(xué)無(wú)止境呀,今天就先到這兒吧~
審核編輯:劉清
-
Boost
+關(guān)注
關(guān)注
5文章
384瀏覽量
49450 -
回調(diào)函數(shù)
+關(guān)注
關(guān)注
0文章
88瀏覽量
11844 -
Ubuntu系統(tǒng)
+關(guān)注
關(guān)注
0文章
91瀏覽量
4260
發(fā)布評(píng)論請(qǐng)先 登錄
C/C++開源庫(kù)及示例代碼簡(jiǎn)介
如何編譯已有的C++去生成可在OpenHarmony系統(tǒng)使用的動(dòng)態(tài)庫(kù)文件呢
用Visual C++做數(shù)據(jù)庫(kù)開發(fā)
c++標(biāo)準(zhǔn)庫(kù)手冊(cè)
The C++ Standard Library
一文讀懂boost庫(kù)的概念和安裝方式
C++開源庫(kù)的詳細(xì)資料合集免費(fèi)下載

C++的框架、庫(kù)和資源資料匯總大全

C++的開源庫(kù)大全詳細(xì)資料說明

C++的框架、庫(kù)和代碼分析的資料大全

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

如何使用DevEco Studio創(chuàng)建Native C++應(yīng)用
C和C++編寫環(huán)境下LabVIEW如何調(diào)用動(dòng)態(tài)庫(kù)?

使用C++編寫通用庫(kù)并在 Rust 中使用它 (WASI)

基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫(kù)案例:ThreadPoll

評(píng)論