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.pswp.cn/news/445742.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445742.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445742.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux gitpush錯誤,linux – GIT:無法推送(奇怪的配置問題)

我正在全新安裝Linux Mint.嘗試從任何存儲庫推送時,我收到以下錯誤:error: Malformed value for push.default: simpleerror: Must be one of nothing,matching,tracking or current.fatal: bad config file line 8 in /home/leng/.gitconfigfatal: Could not read …

linux+shell+func,Linux shell編程筆記總結

Linux Shell學習筆記簡介Linux系統的shell作為操作系統的外殼,為用戶提供使用操作系統的接口。它是命令語言、命令解釋程序及程序設計語言的統稱。shell是用戶和Linux內核之間的接口程序,如果把Linux內核想象成一個球體的中心,shell就是圍繞內…

linux版車機安裝步驟,RedHat Linux 9.0的安裝(詳細圖解安裝過程)

RedHat Linux版本:" b, t) b) b# }, t# z- fC& S$ x0 }) GRedHat Linux是目前世界上使用最多的Linux操作系統。因為它具備最好的圖形界面,無論是安裝、配置還是使用都十分方便,而且運行穩定,因此不論是新手還是老玩家都對它有很高的…

linux中網頁播放音樂,Linux_在Linux系統下播放網頁中的背景音樂技巧,在Linux中的firefox瀏覽許多網頁 - phpStudy...

在Linux系統下播放網頁中的背景音樂技巧在Linux中的firefox瀏覽許多網頁時,很多使用了基于WMP的背景音樂播放器,如部份baidu空間。但firefox默認不支持播放。在LINUX的源中,有一為kaffeine-mozilla-plugin,能在firefox中使用kaffe…

簡單了解linux,linux簡單了解

今天主要了解下linuxlinux目錄結構包含:/:代表根目錄bin(binaries):存放二進制可執行文件sbin(super user binaries):存放二進制可執行文件,只有root才能訪問etc(etcetera)存放系統配置文件usr(unix shared resource):用于存放共享…

C語言多個變量運算存儲過程,postgresql函數中的賦值運算和postgresql函數存儲過程實現數據批量插入...

今天檢查大家寫的postgresql函數時,發現有的家伙不遵守postgresql關于函數中的賦值運算表示方式:variable : value注意的是,是:表示賦值運算,而不是單獨一個等號。這一點和delphi相似?另外,postgresql中關于…

c語言盜取qq號程序,C++獲取本機登陸過的QQ號碼示例程序

// FileName: GetQQ.cpp#include "stdafx.h" // 如果編譯出錯請刪除這句#include "GetQQ.h"GetQQ::GetQQ(){}GetQQ::~GetQQ(){}std::vector GetQQ::Init(void){TCHAR pathBuffer[MAX_PATH] {0};::SHGetSpecialFolderPath(NULL, pathBuffer…

夫曼編碼譯碼系統課程設計實驗報告(含源代碼c++_c語言),哈夫曼編碼譯碼系統課程設計實驗報告(含源代碼C++_C語言)[1]...

目 錄摘 要 ………………………………………………………………………..……………… II Abstract …………………………………………………………………………..………... II 第一章 課題描述………………………..………………………………………………….. 1 1.1 問題描述………

二級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二級聯動購物車,Android實現二級購物車的全選加反選、總價功能

本文實例為大家分享了Android實現二級購物車的全選加反選、總價的具體代碼,供大家參考,具體內容如下MainActivityimport android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;imp…

android studio gradle 自動更新,android studio gradle 兩種更新方法更新

又快一年沒有使用AS了,正好要查看一個Android項目代碼,干脆升級到新版試試看新變化,舊版本為3.1.2,目前最新版本為3.4.2,AS的升級是很簡單的直接update等待即可.升級完了,打開GIT下載的項目,啟動…

android安全 報告,Android安全檢測報告

1.高危 Intent Scheme URL攻擊詳情:惡意頁面可以通過Intent scheme URL執行基于Intent的攻擊建議:將Intent的component/selector設置為null2.高危 WebView應用克隆風險詳情:APP使用WebView訪問網絡,當開啟了允許JS腳本訪問本地文件…

android定時循環,Android AlarmManager實現定時循環后臺任務

這篇文章使用AlarmManager實現了Android定時后臺循環任務。使用場景:項目需要app每隔一段時間就去服務端請求一次接口,從而更新本地保存的信息。AlarmManager簡介AlarmManager是Android中常用的一種系統級別的提示服務,在特定的時刻為我們廣播…

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的源…

android 全局 窗口,miui12全局自由窗口app

miui12全局自由窗口app是小米最新更新的系統引用了全局自由窗口功能,在你玩游戲或者是追劇的時候,都可以直接在一個頁面上聊天,無需切換那么麻煩,支持多種機型進行使用這個功能,多種模式你可以自由的切換使用&#xff…

LeetCode - Medium - 264. Ugly Number II

Topic MathDynamic ProgrammingHeap Description https://leetcode.com/problems/ugly-number-ii/ Analysis 方法一:遍歷自然數,逐個判斷是否是丑數。這方法很低效。 方法二:動態數組。 We have an array k of first n ugly number. W…