linux嵌入式平台测试,protobuf-c 在arm linux 嵌入式平台的使用 测试
关于什么是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 嵌入式平台的使用 测试相关推荐
- arm Linux 低成本方案,参赛作品《低成本基于ARM+Linux平台搭建web服务器的物联网学习板》...
[报名阶段需要填写的内容] 1. 参赛者姓名(必填项): 王徕泽 2. 单位或学校名称(选填项): 徕泽电子工作室 3. 当前职务或职称(选填项): 室长 4. 参赛作品的名字(必填项): 低成本基于 ...
- linux编译freebsd,freebsd下作x86/arm linux的交叉编译器
freebsd下作x86/arm linux的交叉编译器 2009-05-13 01:40:08来源:未知 阅读 () 以纯粹的源码编译交叉编译器,还是头一遭.以往都是利用目标主机上的头文件和库文件作 ...
- 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 ...
- linux下s3c2440开发板,SAMSUNG S3C2440 ARM LINUX 开发板 上手初体验 --开发环境搭建
1,linux开发环境搭建 2,程序测试 easyOpentag驱动安装,打开连接,选择ARM-linux 1,环境搭建 我的系统版本 root@ubuntu:~# lsb_release -a No ...
- linux 无线网卡移植,移植wifi无线网卡到arm linux上全过程
前 段时间移植了U-boot和linux2.6.27.9到mini2440上,最近有点空,手头有一个usb接口的zd1211b芯片的wifi无线网卡 (PSP和NDSL玩家都知道的神卡),于是决定在内 ...
- arm linux 内核崩溃,用sysrq-trigger实现ARM Linux一键内核崩溃、一键关机、一键dump信息等...
原创 宋宝华 Linux阅码场 2018-01-12 sysrq有多种功能,对于ARM Linux这种嵌入式没键盘的系统来说,也可以通过/proc/sysrq-trigger来进行操作. 实验平台:Q ...
- arm linux死机不是崩溃,用sysrq-trigger实现ARM Linux一键内核崩溃、一键关机、一键dump信息等...
sysrq有多种功能,对于ARM Linux这种嵌入式没键盘的系统来说,也可以通过/proc/sysrq-trigger来进行操作. 实验平台:QEMU模拟的ARM Linux 内核版本: # una ...
- 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 ...
- arm linux 开机电路_ARM Linux启动过程分析
摘 要: 嵌入式 Linux 的可移植性使得我们可以在各种电子产品上看到它的身影.对 于不 同体系结构的处理器来说 Linux 的启动过程也有所不同. 本文以 S3C2410 ARM 处理器为例, 详 ...
- 补充嵌入式后期的开发~~分享一下自己的嵌入式学习经验~~也纪念一下即将逝去的青春
自己的嵌入式学习经验~~也纪念一下即将逝去的青春 大一听说嵌入式很有挑战性,菜鸟也想挑战一下下,就开始了我的学习之旅,但是后来发现上了操作系统的arm完全没有自己想象的那么简单,简单的led程序都不会 ...
最新文章
- 看过漫改,但你看过「改漫」吗?AI 一键让影视变漫画
- 属于我们的纪念日-相识一周年 - 生活至上,美容至尚!
- java Cast Exception
- 接口测试工具-Jmeter压力测试使用
- 云函数连接mysql超时_云函数访问MYSQL数据库出错?
- Python(1):写在前面
- Python之石头剪刀布
- 数组的合并和升序排列_每日“力扣”系列10 下一个排列
- phpstorm 10 注册码
- 偏移出来的数据不准_关于AD7616采集后读回来数据不准(有偏移)的问题
- 八、JVM视角浅理解并发和锁
- LeetCode 372. 超级次方(递归)
- mac电脑运行速度变慢的十种解决方法
- 网页制作大作业HTML+CSS制作静态网页----原神
- Druid——Hadoop-based Batch Ingestion
- WEB前端打开摄像头
- 扫地机器人朋友圈文案_最近,一台不务正业的愚大宝扫地机器人火遍朋友圈
- linux 升级root,linux系统内核升级实例
- 【清华集训2014】玛里苟斯
- python安装第三方库遇到 ERROR: Command errored out with exit status 1:
热门文章
- c++ 字符串拼接_字符串拼接新姿势:StringJoiner
- java中输出值保留四位小数_Java工程师(3).变量和数据类型
- 通过VisualSVN的POST-COMMIT钩子自动部署代码
- 【转】ABP源码分析四十六:ABP ZERO中的Ldap模块
- MVC和WebForm区别
- 第一节:WebApi的纯原生态的RestFul风格接口和路由规则介绍
- sap 订单状态修改时间_SAP中对于获取订单的状态
- 算法 -克鲁斯卡尔算法
- 【Python CheckiO 题解】Count Consecutive Summers
- HashMap和ConcurrentHashMap