日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發布時間:2023/12/13 linux 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 嵌入式平台的使用 测试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。