protobuf 在嵌入式ARM平臺的應用(c語言版)

云的边界發表於2024-04-19

一、PC上安裝protobuf和protobuf-c

1. 安裝protobuf

protocolbuffers 倉庫地址 :https://github.com/protocolbuffers/protobuf

本文選擇下載 v21.12版本(太新版本 protobuf-c可能不支援)

$ cd protobuf-21.12
$ ./autogen.sh
$ ./configure  #預設安裝路徑/usr/local/
$ make 
$ sudo make install 

2. 安裝protobuf-c

倉庫地址:https://github.com/protobuf-c/protobuf-c

$ git clone https://github.com/protobuf-c/protobuf-c.git
$ cd protobuf-c
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig

會生成 /usr/local/bin/protoc-c 和 /usr/local/bin/protoc-gen-c ,用於根據.proto 生成 c 原始碼。

二、交叉編譯protobuf-c庫

#重新進入 protobuf-c 目錄
$ make clean #清除之前的配置
$ ./configure --host=arm-none-linux-gnueabihf CC=arm-none-linux-gnueabihf-gcc CXX=arm-none-linux-gnueabihf-g++ --disable-protoc --prefix=$PWD/tmp
$ make 
$ make install

會生成lib和include,其中libprotobuf-c.so* 需要複製到ARM開發板中(如/lib下)。

三、protobuf 試用

1. 建立 msg.proto 檔案

syntax = "proto3";

message MB04RSP
{
  string name = 1;
  uint32 addr = 2;
  uint32 num  = 3;
  repeated uint32 data = 4;
}

2. protoc 生成 c 程式碼

$ protoc --c_out=. msg.proto

結果會自動生成 msg.pb-c.c 和 msg.pb-c.h

3. 主要API

msg.pb-c.h中列出了訊息結構序列化、反序列化的API。

/* 初始化MB04RSP訊息結構體 */
void   mb04_rsp__init
                     (MB04RSP         *message);

/* 將訊息體 message 序列化到 out 緩衝區 ,返回序列化後位元組長度 */
size_t mb04_rsp__pack
                     (const MB04RSP   *message,
                      uint8_t             *out);

/* 從緩衝區data 反序列化 到訊息結構 MB04RSP, 返回結構體指標(指向記憶體預設為堆) */
MB04RSP *
       mb04_rsp__unpack
                     (ProtobufCAllocator  *allocator,
                      size_t               len,
                      const uint8_t       *data);

/* 釋放儲存反序列化返回的結構體記憶體 */
void   mb04_rsp__free_unpacked
                     (MB04RSP *message,
                      ProtobufCAllocator *allocator);

交叉編譯app時記得連線第二節生成的 ARM平臺庫 libprotobuf-c.so*。

參考博文: https://blog.csdn.net/zhengnianli/article/details/110914259

相關文章