Protobuf:一種更小、更快、更高效的協(xié)議_第1頁
Protobuf:一種更小、更快、更高效的協(xié)議_第2頁
Protobuf:一種更小、更快、更高效的協(xié)議_第3頁
Protobuf:一種更小、更快、更高效的協(xié)議_第4頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、 protobuf:一種更小、更快、更高效的協(xié)議 導(dǎo)讀本篇文章我們來分享一種更輕量的數(shù)據(jù)格式protobuf。前言之前分享關(guān)于json的使用:例說嵌入式實用知識之json數(shù)據(jù)。json類型數(shù)據(jù)可讀性很好,但是整個數(shù)據(jù)包中會帶有一些無用的數(shù)據(jù),會在一定程度上帶來通信負(fù)擔(dān)。本篇文章我們來分享一種更輕量的數(shù)據(jù)格式tobuf的優(yōu)點: 更小、更快、更簡單。 支持多種編程語言 。 解析速度快。 可擴展性強。什么是protobuf、protobuf-c?protocol buffers,是google公司開發(fā)的一種數(shù)據(jù)格式,類似于xml能夠?qū)⒔Y(jié)構(gòu)化數(shù)據(jù)序列化,可用于數(shù)據(jù)存儲、通信協(xié)議

2、等方面。它不依賴于語言和平臺并且可擴展性極強。protobuf倉庫:github:下載速度比較慢,可以先導(dǎo)入到碼云,再下載。protobuf支持多種編程語言:可以看到,protobuf支持一些主流的語言,唯獨沒有支持c。所以誕生了第三方的tobuf-c倉庫:安裝protobuf、protobuf-c我們要使用基于c語言的protobuf,首先需要安裝protobuf與protobuf-c。下面是在ubuntu下安裝的方法:1、安裝protobuf安裝protobuf需要依賴一些工具,需要先安裝依賴:sudoapt-getinstallautoconfautomake

3、libtoolcurlmakeg+unzip安裝完依賴后一依次輸入如下命令下載、編譯、安裝(下載速度慢的話可以先導(dǎo)入碼云再下載)protobuf:gitclonecdprotobuf./autogen.sh./configuremakesudomakeinstallsudoldconfig其中,執(zhí)行./autogen.sh命令為了生成configure配置腳本,執(zhí)行configure可生成makefile文件,執(zhí)行make進行編譯,執(zhí)行sudo make install命令進行安裝,執(zhí)行sudo ldconfig命令讓動態(tài)鏈接庫為系統(tǒng)所共享。2、安裝protobuf-c同樣的,protobuf

4、-c也要依賴于 pkg-config ,輸入以下命令進行安裝:sudoapt-getinstallpkg-config然后輸入如下命令下載、編譯、安裝protobuf-c:gitclone cdprotobuf-c./autogen.sh./configuremakesudomakeinstall按以上方式安裝的話,protobuf與protobuf-c默認(rèn)安裝在/usr/local路徑下:溫馨提示:安裝過程可能會出現(xiàn)各種各樣的錯誤,遇到錯誤的時候仔細(xì)看錯誤描述及看本篇文章安裝步驟,看是否遺漏了哪一步。實踐demoprotobuf的核心是一個.proto文件,我們自定義一個.proto來創(chuàng)建我

5、們的協(xié)議數(shù)據(jù),然后使用protoc-c工具編譯生成c代碼,有兩個文件:一個頭文件、一個源文件。例如我們創(chuàng)建一個to文件:syntax= proto2;messagestudentrequired string name= 1;requireduint32num= 2;requireduint32c_score= 3;其中syntax為語法版本,有proto2、proto3兩個版本,我們使用proto2。同c語言類似,.proto也規(guī)定了一些數(shù)據(jù)格式,如proto2的數(shù)據(jù)類型有:double 、 float、 int32 、 uint32 、 string 等。本例中,me

6、ssage為關(guān)鍵字,修飾的student會對應(yīng)生成我們c中的student結(jié)構(gòu)體。其中required為前綴修飾,表明該字段是必填字段。還有其它兩個修飾關(guān)鍵字: optional:聲明該字段是可選字段。 repeated:聲明該字段是可重復(fù)字段,通常用數(shù)組表示,也可以是list。使用protoc-c工具工具編譯to文件的命令:protoc-c_out=.to此時編譯會生成student.pb-c.c、student.pb-c.h兩個文件。我們看看student.pb-c.h里面有什么:可以看到,student.pb-c.h里生成了一個協(xié)議數(shù)據(jù)結(jié)構(gòu)體與

7、操作該結(jié)構(gòu)體的一些接口,包括組包與解包接口,對應(yīng)的student.pb-c.c里就是這些接口對應(yīng)的實現(xiàn)。編寫我們的student.c測試demo:左右滑動查看全部代碼#include #include #include #include student.pb-c.h int main(void) studentpack_stu=0; uint8_t buffer512=0;student*unpack_stu= null; size_t len= 0;student_init(&pack_stu); /*組包*/ pack_= zhengn;pack_stu.num= 88;p

8、ack_stu.c_score= 90;len=student_pack(&pack_stu,buffer); printf(len=%ldn,len); /*解包*/ unpack_stu=student_unpack(null,len,buffer); printf(unpack_=%sn,unpack_stu-name); printf(unpack_stu.num=%dn,unpack_stu-num); printf(unpack_stu.c_score=%dn,unpack_stu-c_score);student_free_unpacked(unpack_stu,

9、 null); return 0;demo很簡單,組包就是構(gòu)造一個協(xié)議數(shù)據(jù)結(jié)構(gòu)體,調(diào)用pack組包接口往buffer中扔數(shù)據(jù);解包正好是反過來,從buffer中拿數(shù)據(jù)放到結(jié)構(gòu)體里。編譯命令:gccstudent.cstudent.pb-c.c-ostudent-lprotobuf-c加上-lprotobuf-c參數(shù)鏈接動態(tài)鏈接庫protobuf-c.so,因為前面安裝操作的時候有使用ldconfig命令了,所以這里不需要指定動態(tài)庫路徑,否則需要指定,指定方法參照往期文章:靜態(tài)鏈接與動態(tài)鏈接補充(linux)、什么是動態(tài)鏈接與靜態(tài)鏈接?編譯運行:如果運行時報錯:找不到動態(tài)庫??奢斎肴缦旅顚?dǎo)出動態(tài)庫:export ld_library_path=/usr/local/lib:$ld_library_path具體解釋可查看往期文章:靜態(tài)鏈接與動態(tài)鏈接補充(linux)以上就是本次關(guān)于protobuf的分享,本文給出了pc上的實例,感興趣的小伙伴不妨嘗試運用到stm32、嵌入式linux中,后續(xù)有機會的話再繼續(xù)做相關(guān)分享。如果覺得文章有用,記得給給小編三連哦猜你喜歡mqtt應(yīng)用于進程間通信自定義協(xié)議的這些典型例子你會了嗎?例說嵌入式實

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論