关于什么是protobuf,网上搜搜一大堆,很多人用的都还是json,以为json是多种语言传输数据是万能的,看完了protobuf的实现,就明白了简单高效才是王道。

1、首先写一个.proto扩展名的文件json.proto,内容格式如下

message response

{

required uint32 led_on=1;

required string node_id=2;

required string parent_id=3;

required string uuid=4;

}

2、执行命令生成.c和.h文件,protoc-c可执行文件已经预先生成了,编译protobuf-c参考http://www.voidcn.com/article/p-vfpixjej-dk.html

./protoc-c json.proto

3、写示例代码main.c:

解析:protobuf的核心就是pack和unpack以及最后的free_unpack,比如客户端要给服务端发送一个msg,客户端把pack好的pBuf缓冲区数据直接发出去,服务端收到数据之后,再从pBuf里面“取出”out结构体指针指向的msg,最后调用free_unpacked释放out就可以了。

//main.c

#include

#include

#include

#include "json.pb-c.h"

int main(void)

{

Response msg,*out;

unsigned char *pBuf;

unsigned int Len;

response__init(&msg); //init default

msg.led_on=1;

msg.node_id="5149013220584027";

msg.parent_id="5149013108519750";

msg.uuid="121212121";

Len=response__get_packed_size(&msg);

printf("msg pack size %d\n",Len);

pBuf=malloc(Len);

if(pBuf)

{

response__pack(&msg,pBuf); //construct msg to pBuf

FILE *fp =fopen("protobuf.txt","wb+"); //output raw

if(fp)

{

fwrite(pBuf,Len,1,fp);

fclose(fp);

fp=NULL;

}

out=response__unpack(NULL,Len,pBuf);

if(out)

{

printf("out->led_on=%d\n",((Response*)out)->led_on);

printf("out->node_id=%s\n",((Response*)out)->node_id);

printf("out->parent_id=%s\n",((Response*)out)->parent_id);

printf("out->uuid=%s\n",((Response*)out)->uuid);

response__free_unpacked(out,NULL);

}

}

printf("End\n");

}

4、编译注意事项

注意相关头文件所在目录为./protobuf-c/protobuf-c.h,相关libprotobuf-c.so库文件所在路径为./protobuf-c-arm/lib

5、编译,最终生成main可执行文件,将main放在开发板上,注意,相关的libc库和libprotobuf-c.so链接库都放在了开发板上/usr/arm-linux-gnueabi/lib目录下,否则运行是找不到.so库的

arm-linux-gnueabi-gcc main.c -o main json.pb-c.c -I./ -lprotobuf-c -L./protobuf-c-arm/lib -Wl,-rpath,/usr/arm-linux-gnueabi/lib

6、运行./main

实现了msg消息发送给out输出,同样类型的消息,Json需要91个字节,protobuf只需要49个字节,其实json里面的键值对name是完全不需要传输的,因为通讯双方都知道对应的name,只需要传输的只是value,但是每次传输数据,都要把name都传来传去,消耗了大量的带宽和数据存储空间

下面是测试结果

附录:

1、经过测试,我们发现,其实protobuf的原理很简单,和两端都是C语言实现的client/server直接传输结构体变量原理是一样的,我们都知道, C语言结构体成员的存储方式都是顺序存储。所以发送和接收方都按照对应的成员排列位置进行解析,就可以实现数据的传输。

2、但是protobuf设计初衷应该是为了适应不同的语言之间数据传输,像java写的server里面就没有结构体,所以就不能传输C写的client里面的结构体变量给对方,对方是解析不了的。另外protobuf在.proto文件里面指定了具体的位置编号,否则应该就没办法生成.c和.h文件,如果后续双方通讯格式要做调整,双方都使用同一个修改后的.proto文件重新生产对应的源文件,重新编译即可。

3、为什么说用protobuf比json简单高效,原因就是你用json传输数据,每次字符串里面都传输了一堆没用的数据,比如键值对的冒号,以及键值名字和值的双引号,还有大小括号,因为通讯双方都知道对应的键值名以及怎么解析json(如果不知道键值名字,收到的数据还怎么解析)。

双方都有的数据还每次传来传去,不是浪费是什么? 纯粹就是浪费带宽和存储,要传输的对方没有的数据,这才是有用数据。有人就说,这几个括号和键值名字能浪费多少带宽和空间,别小看这些小东西,假如数据交互量大和非常频繁,你就知道了,这里面的存储空间和带宽消耗差距是可怕惊人的。

linux嵌入式平台测试,protobuf-c 在arm linux 嵌入式平台的使用 测试相关推荐

  1. arm Linux 低成本方案,参赛作品《低成本基于ARM+Linux平台搭建web服务器的物联网学习板》...

    [报名阶段需要填写的内容] 1. 参赛者姓名(必填项): 王徕泽 2. 单位或学校名称(选填项): 徕泽电子工作室 3. 当前职务或职称(选填项): 室长 4. 参赛作品的名字(必填项): 低成本基于 ...

  2. linux编译freebsd,freebsd下作x86/arm linux的交叉编译器

    freebsd下作x86/arm linux的交叉编译器 2009-05-13 01:40:08来源:未知 阅读 () 以纯粹的源码编译交叉编译器,还是头一遭.以往都是利用目标主机上的头文件和库文件作 ...

  3. dtb文件linux位置,dtb文件的由来与ARM Linux 3.x的设备树(Device Tree)

    1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称"this whole ARM thing is a f*ckin ...

  4. linux下s3c2440开发板,SAMSUNG S3C2440 ARM LINUX 开发板 上手初体验 --开发环境搭建

    1,linux开发环境搭建 2,程序测试 easyOpentag驱动安装,打开连接,选择ARM-linux 1,环境搭建 我的系统版本 root@ubuntu:~# lsb_release -a No ...

  5. linux 无线网卡移植,移植wifi无线网卡到arm linux上全过程

    前 段时间移植了U-boot和linux2.6.27.9到mini2440上,最近有点空,手头有一个usb接口的zd1211b芯片的wifi无线网卡 (PSP和NDSL玩家都知道的神卡),于是决定在内 ...

  6. arm linux 内核崩溃,用sysrq-trigger实现ARM Linux一键内核崩溃、一键关机、一键dump信息等...

    原创 宋宝华 Linux阅码场 2018-01-12 sysrq有多种功能,对于ARM Linux这种嵌入式没键盘的系统来说,也可以通过/proc/sysrq-trigger来进行操作. 实验平台:Q ...

  7. arm linux死机不是崩溃,用sysrq-trigger实现ARM Linux一键内核崩溃、一键关机、一键dump信息等...

    sysrq有多种功能,对于ARM Linux这种嵌入式没键盘的系统来说,也可以通过/proc/sysrq-trigger来进行操作. 实验平台:QEMU模拟的ARM Linux 内核版本: # una ...

  8. QT4.8.6的交叉编译 - 编译平台:Ubuntu 20.04 LTS,目标平台:linux/imx6ull

    版本记录表 开发环境 编译环境: 64位Ubuntu 20.04 LTS 交叉编译工具链: arm-linux-gnueabihf-GCC 4.9.1 本地编译器:gcc version 7.5.0 ...

  9. arm linux 开机电路_ARM Linux启动过程分析

    摘 要: 嵌入式 Linux 的可移植性使得我们可以在各种电子产品上看到它的身影.对 于不 同体系结构的处理器来说 Linux 的启动过程也有所不同. 本文以 S3C2410 ARM 处理器为例, 详 ...

  10. 补充嵌入式后期的开发~~分享一下自己的嵌入式学习经验~~也纪念一下即将逝去的青春

    自己的嵌入式学习经验~~也纪念一下即将逝去的青春 大一听说嵌入式很有挑战性,菜鸟也想挑战一下下,就开始了我的学习之旅,但是后来发现上了操作系统的arm完全没有自己想象的那么简单,简单的led程序都不会 ...

最新文章

  1. 看过漫改,但你看过「改漫」吗?AI 一键让影视变漫画
  2. 属于我们的纪念日-相识一周年 - 生活至上,美容至尚!
  3. java Cast Exception
  4. 接口测试工具-Jmeter压力测试使用
  5. 云函数连接mysql超时_云函数访问MYSQL数据库出错?
  6. Python(1):写在前面
  7. Python之石头剪刀布
  8. 数组的合并和升序排列_每日“力扣”系列10 下一个排列
  9. phpstorm 10 注册码
  10. 偏移出来的数据不准_关于AD7616采集后读回来数据不准(有偏移)的问题
  11. 八、JVM视角浅理解并发和锁
  12. LeetCode 372. 超级次方(递归)
  13. mac电脑运行速度变慢的十种解决方法
  14. 网页制作大作业HTML+CSS制作静态网页----原神
  15. Druid——Hadoop-based Batch Ingestion
  16. WEB前端打开摄像头
  17. 扫地机器人朋友圈文案_最近,一台不务正业的愚大宝扫地机器人火遍朋友圈
  18. linux 升级root,linux系统内核升级实例
  19. 【清华集训2014】玛里苟斯
  20. python安装第三方库遇到 ERROR: Command errored out with exit status 1:

热门文章

  1. c++ 字符串拼接_字符串拼接新姿势:StringJoiner
  2. java中输出值保留四位小数_Java工程师(3).变量和数据类型
  3. 通过VisualSVN的POST-COMMIT钩子自动部署代码
  4. 【转】ABP源码分析四十六:ABP ZERO中的Ldap模块
  5. MVC和WebForm区别
  6. 第一节:WebApi的纯原生态的RestFul风格接口和路由规则介绍
  7. sap 订单状态修改时间_SAP中对于获取订单的状态
  8. 算法 -克鲁斯卡尔算法
  9. 【Python CheckiO 题解】Count Consecutive Summers
  10. HashMap和ConcurrentHashMap