Instalação do protobuf e protobuf-c no ambiente de desenvolvimento PC
Para utilizar o Protocol Buffers em plataformas ARM embacradas, é necessário primeiro preparar o ambiente de desenvolvimento no PC. Isso envolve a instalação das ferramentas protobuf e protobuf-c.
Repositório oficial do protobuf: https://github.com/protocolbuffers/protobuf
Recomenda-se baixar a versão v21.12, pois versões mais recentes podem não ser totalmente compatíveis com o protobuf-c.
cd protobuf-21.12
./autogen.sh
./configure # Instalação padrão em /usr/local/
make
sudo make install
Em seguida, instale o protobuf-c a partir do seu repositório.
Repositório do 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
Isso gerará os executáveis protoc-c e protoc-gen-c em /usr/local/bin/, utilizados para compilar arquivos .proto em código-fonte C.
Compilação cruzada da biblioteca protobuf-c para a plataforma alvo ARM
Após a instalação no PC, é necessário compilar a biblioteca protobuf-c de forma cruzada para a arquitetura ARM. Retorne ao diretório do código-fonte do protobuf-c e limpe as configurações anteriores.
make clean
./configure --host=arm-none-linux-gnueabihf CC=arm-none-linux-gnueabihf-gcc CXX=arm-none-linux-gnueabihf-g++ --disable-protoc --prefix=$(pwd)/saida
make
make install
Isso prdouzirá os diretórios lib e include dentro do caminho de instalação. As bibliotecas compartilhadas como libprotobuf-c.so* devem ser copiadas para o sistema de arquivos do dispositivo ARM, por exemplo, no diretório /lib.
Exemplo prático de uso do Protocol Buffers com C
Crie um arquivo de definição de mensagem, como mensagem_exemplo.proto, com a sintaxe proto3.
syntax = "proto3";
message RespostaSensor
{
string identificador = 1;
uint32 endereco = 2;
uint32 quantidade = 3;
repeated uint32 valores = 4;
}
Compile o arquivo .proto para gerar os fontes em C utilizando o compilador do protobuf-c.
protoc --c_out=. mensagem_exemplo.proto
Isso gerará automaticamente os arquivos mensagem_exemplo.pb-c.c e mensagem_exemplo.pb-c.h. O arquivo de cabeçalho contém as funções essenciais para serialização e desserialização.
/* Inicializa a estrutura da mensagem RespostaSensor */
void resposta_sensor__init
(RespostaSensor *msg);
/* Serializa a mensagem 'msg' no buffer 'saida', retornando o tamanho em bytes */
size_t resposta_sensor__pack
(const RespostaSensor *msg,
uint8_t *saida);
/* Desserializa os dados do buffer 'dados' para uma estrutura RespostaSensor, usando o alocador fornecido */
RespostaSensor *
resposta_sensor__unpack
(ProtobufCAllocator *alocador,
size_t tamanho,
const uint8_t *dados);
/* Libera a memória alocada para uma mensagem desserializada */
void resposta_sensor__free_unpacked
(RespostaSensor *msg,
ProtobufCAllocator *alocador);
Ao compilar a aplicação final para a plataforma ARM, lembre-se de vincular a biblioteca libprotobuf-c.so* gerada na etapa de compilação cruzada.
Referência adicional: https://blog.csdn.net/zhengnianli/article/details/110914259