protocol buffer通信協議 c語言使用和內部打包解析


protocol buffer是谷歌開發的一種開源數據傳輸語言格式,類似於json和XML等,在嵌入式開發中據我所知藍牙通信經常用到protobuf,主要特點是打包和解包速度快,同時本身具有一定的加密性,雖然經過本人分析,加密性並不高哈哈,不過已經比json和xml這種直接把數據直觀顯示出來的加密性高很多了。

目前protobuf支持的語言:

 

 C語言外部庫

比較顯著的幾個特點:

1】數據打包和解包速度快,基本上打包和解包的過程就是把數據按照協議羅列上去,所以很快

2】打包完數據體積小,主要還是整個過程中格式相關的東西比較少,導致占用帶寬少,傳輸效率高

3】有一定的加密性

4】好上手,在官網上都有各種語言(C語言是單獨的)的打包工具,只需要把自定義的protobuf結構文件按照官方wiki自動生成一下就可以了,會生成一些打包和解包的接口,使用的時候只需要按照將自己的數據傳進去就可以了

官網:https://code.google.com/p/protobuf/

c語言版本網站:http://code.google.com/p/protobuf-c/

probobuf-c生成工具的使用

先下載安裝google protocol buffer ,再下載安裝 protocol buffer C,

1】下載完成后,./configure --prefix=/usr/local 生成makefile文件

2】執行make編譯

3】make install 安裝到本地環境中

可能遇到的一些問題

1】linux缺少庫的問題,缺少什么庫就安裝什么庫,可以更換一個速度快一點的源,同時執行sudo apt-get update 和 sudo apt-get upgrade

2】缺少gcc、g++等軟件,執行sudo apt-get install gcc 和sudo apt-get install g++ 安裝即可

最后將.proto文件 放到指定目錄下,執行protoc-c --c_out=. /test.proto 就可以在當前目錄下生成指定的.c和.h文件

所有的解包和打包接口都可以在.h文件中找到

 

打包和解包源碼簡讀: 1 /*proto源文 2 message TestMessage {

 1  /*proto*/ 
2   message TestMessage {

3   required uint32 num = 1; 4 optional bytes buf = 2; 5 } 6 /*.h文件中生成的對應結構體*/ 7 struct _Protos__TestMessage 8 { 9 ProtobufCMessage base; 10 uint32_t num; 11 protobuf_c_boolean hasbuf; 12 ProtobufCBinaryData buf; 13 }; 14 /* .h中與當前結構相關的所有接口 Protos__ methods */
15 typedef struct _Protos__TestMessage Protos__TestMessage; 16 void protos__test_message__init(Protos__TestMessage*message); 17 size_t protos__test_message__get_packed_size(const Protos__TestMessage*message);
18 size_t protos__test_message__pack(const Protos__TestMessage*message, 19 uint8_t *out); 20 size_t protos__test_message__pack_to_buffer(const Protos__TestMessage*message, 21 ProtobufCBuffer *buffer); 22 Protos__TestMessage* protos__test_message__unpack(ProtobufCAllocator *allocator, 24             size_t len, 25             const uint8_t *data); 26 void protos__test_message__free_unpacked(Protos__TestMessage*message, 27 ProtobufCAllocator *allocator);

以上所有的接口實現都在.c文件中,

最主要是打包接口和解包接口,閱讀源碼可以看到打包的過程就是按照結構的順序去拼裝數據;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM