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文件中,
最主要是打包接口和解包接口,阅读源码可以看到打包的过程就是按照结构的顺序去拼装数据;