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都传来传去,消耗了大量的带宽和数据存储空间

下面是测试结果

0818b9ca8b590ca3270a3433284dd417.png

附录:

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

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

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

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

0818b9ca8b590ca3270a3433284dd417.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux版车机安装步骤,RedHat Linux 9.0的安装(详细图解安装过程)

RedHat Linux版本:" b, t) b) b# }, t# z- fC& S$ x0 }) GRedHat Linux是目前世界上使用最多的Linux操作系统。因为它具备最好的图形界面,无论是安装、配置还是使用都十分方便,而且运行稳定,因此不论是新手还是老玩家都对它有很高的…

简单了解linux,linux简单了解

今天主要了解下linuxlinux目录结构包含:/:代表根目录bin(binaries):存放二进制可执行文件sbin(super user binaries):存放二进制可执行文件,只有root才能访问etc(etcetera)存放系统配置文件usr(unix shared resource):用于存放共享…

二级c语言评分标准一样吗,计算机二级评分严格吗 步骤错了有分吗

计算机二级考试不是人工阅卷,是由计算机评分,所以是很严格的。计算机二级机器阅卷主要看的是最后的输出文件,如果步骤错了导致结果不正确的话,也是没有分的。计算机二级评分标准计算机二级考试是电脑自动评分的,即上机…

c语言a 寻路算法,JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例

本文实例讲述了JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法。分享给大家供大家参考,具体如下:完整实例代码如下:A*寻路算法#stage {border: 1px solid lightgray;}window.onload function () {var stage document.querySelector(#stage…

在wsl下运行c语言,在Windows10通过WSL架设linux/gcc c语言学习环境

在Windows10通过WSL架设linux/gcc c语言学习环境零:简单介绍与先决条件中国一般的大学C课程中都使用很过时的编译器来进行教授——比如说什么visual studio 6.0啊,dev c啊。以笔者的眼界所看到的C语言教程中,大多都建议学习者在Linux环境下学…

android studio gradle 自动更新,android studio gradle 两种更新方法更新

又快一年没有使用AS了,正好要查看一个Android项目代码,干脆升级到新版试试看新变化,旧版本为3.1.2,目前最新版本为3.4.2,AS的升级是很简单的直接update等待即可.升级完了,打开GIT下载的项目,启动…

android 线性布局蒙层,Android开发 - 掌握ConstraintLayout(一)传统布局的问题

在传统的Android开发中,页面布局占用了我们很多的开发时间,而且面对复杂页面的时候,传统的一些布局会显得非常复杂,每种布局都有特定的应用场景,我们通常需要各种布局结合起来使用来实现复杂的页面。随着ConstraintLay…

android sdk 4.4.4,4.4.4 not in Android SDK manager

问题I need to do some testing with 4.4.4 and it isnt available in my Android SDK Manager?Any ideas on what Im doing wrong?回答1:There is no problem at you Android SDK Manager, you just have to download the API 19.The API 19 is used by all the KitKat devi…

android7.0提示定位,解决android7.0上某些PopuWindow显示位置不正确的问题

网上关于android系统7.0的popupwindow适配的解决方案,基本都是一样的,就是重写PopupWindow里面的方法但是如何进行重写,对于一个初次接触的人来说,是个很头疼的问题。一来是涉及到java基础,二来是涉及到popupwindow的源…

html文档定义层标记是,jsp练习题目201312

《JSP商务网站设计》复习综合题型一、单项选择题1. 关于分页显示,下列的叙述哪一项是不正确的?()A)只编制一个页面是不可能实现分页显示的B)采用一至三个页面都可以实现分页显示C)分页显示中,记录集不必在页面跳转后重新生成D)分页显示中页面…

html一个页面同时加载多个饼图,Html5饼图绘制实现统计图的方法

Html5提供了强大的绘图API,让我们能够使用javascript轻松绘制各种图形。本文将主要讲解使用HTML5绘制饼图(统计图)的方法。先看一下饼图效果:这个图是动态生成的,根据传入的比例参数(数组),来动态绘制饼图。饼图的大小也是根据高度…

html中半透明效果,CSS半透明效果的属性和场景

在CSS中与半透明效果相关的属性有两个:opacity和rgba。opacity属性的值规定透明度。从 0.0 (完全透明)到 1.0(完全不透明)。设置opacity元素的所有后代元素会随着一起具有透明性,一般用于调整图片或者模块的整体不透明度。IE8 以及更早的版本支持替代的 …

HTML5新增的video标签,HTML5中video标签的使用方法

HTML5中video标签的使用方法发布时间:2020-08-27 11:33:56来源:亿速云阅读:100作者:小新这篇文章将为大家详细讲解有关HTML5中video标签的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希…

开封高级高考2021成绩查询,2021开封市地区高考成绩排名查询,开封市高考各高中成绩喜报榜单...

距离2018年高考还有不到一个月的时间了,很多人在准备最后冲刺的同时,也在关心高考成绩。2018各地区高考成绩排名查询,高考各高中成绩喜报榜单尚未公布,下面是往年各地区高考成绩排名查询,高考各高中成绩喜报榜单,想要了解同学可以…

【清华大学】《逻辑学概论》笔记

教学视频来源 ----第0讲 概要-0.1 讲师介绍0.2 课程内容--第1讲 什么是逻辑学?-1.1 “逻辑和逻辑学1.2 推理和推理形式1.3 有效推理形式1.4 逻辑学的特点1.5 逻辑学的基本准则1.6 逻辑学和其他学科的关系1.7 关于本课程《逻辑学概论》---第2讲 逻辑学的产生与发展-…

公用计算机管理,如何管理公用计算机和私人计算机的文件访问

如何管理公用计算机和私人计算机的文件访问08/07/2014本文内容适用于: Exchange Server 2007 SP3, Exchange Server 2007 SP2, Exchange Server 2007 SP1, Exchange Server 2007上一次修改主题: 2011-08-01本主题将介绍如何为 Microsoft Exchange Server…

Spring Boot 2 学习笔记(1 / 2)

Spring Boot 2 学习笔记(2 / 2) ---01、基础入门-SpringBoot2课程介绍02、基础入门-Spring生态圈03、基础入门-SpringBoot的大时代背景04、基础入门-SpringBoot官方文档架构05、基础入门-SpringBoot-HelloWorld06、基础入门-SpringBoot-依赖管理特性07、…

Spring Boot 2 学习笔记(2 / 2)

Spring Boot 2 学习笔记(1 / 2) ---45、web实验-抽取公共页面46、web实验-遍历数据与页面bug修改47、视图解析-【源码分析】-视图解析器与视图48、拦截器-登录检查与静态资源放行49、拦截器-【源码分析】-拦截器的执行时机和原理50、文件上传-单文件与多…

写出表格的结构html,一个面试题,根据json结构生成html表格

我的输入是{A1: {B1: {C1: {D1: 1233,D2: 11},C2: {D1: 10,D2: 10}},B2: {C1: {D1: 10,D2: 11},C2: {D1: 10,D2: 10},C3: {D1: 10,D2: 10}}}}用什么框架都可以,只要求输出以下table, json的最后一个节点就是table的最后一个column,并且只能占…

足球点球 html5,身为西甲第一点球手,C罗只有5次让点经历,难怪点球破门过百...

当今足坛是C罗和梅西的天下,两人持续不断的刷新创造各种记录,让球迷应接不暇。比梅西大2岁的C罗近期更是开挂,今天说他的点球。C罗现在是西甲历史上的第一点球手本赛季西甲第21轮,皇马客场4-1大胜瓦伦西亚,C罗在比赛中…