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文件中,

最主要是打包接口和解包接口,阅读源码可以看到打包的过程就是按照结构的顺序去拼装数据;