[Google Protobuf] For C++ in Linux - Basic example code 기본 소스 코드 사용 샘플

Posted by [하늘이]
2020. 1. 30. 12:24 IT/C, C++
반응형

[Google Protobuf] For C++ in Linux - Basic example code



※ 관련글

  • Google Protobuf
  1. [Google Protobuf] For Java in Android Studio - 설치 및 proto 파일 컴파일
  2. [Google Protobuf] For Java in Android Studio - Gen Java 파일 Android Studio 적용
  3. [Google Protobuf] For Java in Android Studio - Basic example code 기본 소스 코드 사용 샘플
  4. [Google Protobuf] For C++ in Linux - Settings C++ 빌드 환경 만들기
  5. [Google Protobuf] For C++ in Linux - Basic example code 기본 소스 코드 사용 샘플
  • Nanopb Basic type value example
  1. [Nanopb for Google protobuf] Basic type proto sample
  2. [Nanopb for Google protobuf] Basic type proto sample - Sample proto file
  3. [Nanopb for Google protobuf] Basic type proto sample - Encode sample code
  4. [Nanopb for Google protobuf] Basic type proto sample - Decode sample code
  • Nanopb String / bytes value example
  1. [Nanopb for Google protobuf] String/Bytes type proto
  2. [Nanopb for Google protobuf] String/Bytes type proto - Sample proto file 
  3. [Nanopb for Google protobuf] String/Bytes type proto - Encode example code 1
  4. [Nanopb for Google protobuf] String/Bytes type proto - Encode example code 2
  5. [Nanopb for Google protobuf] String/Bytes type proto - Decode example code
  • Nanopb basic submsg example
  1. [Nanopb for Google protobuf] Sub message - Example proto file
  2. [Nanopb for Google protobuf] Sub message - Encode example code
  3. [Nanopb for Google protobuf] Sub message - Decode example code
  • Nanopb array submsg value example
  1. [Nanopb for Google protobuf] Array Sub message - Example proto file
  2. [Nanopb for Google protobuf] Array Sub message - Encode example code
  3. [Nanopb for Google protobuf] Array Sub message - Decode example code



# 객체를 생성하여 byte 배열로 만드는 샘플

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void protoObjTest::startTest()
{
    LOGD("Test Proto buf Start"0);
    GOOGLE_PROTOBUF_VERIFY_VERSION;
    LOGD("Test Proto checked version"0);
 
    test::PeriodicPos testProtoObj; // protobuf 파일에서 만든 객체 정의
    makeOneObj(&testProtoObj); //객체에 넣고 싶은 내용들을 넣는다. 내부에 있는 List 도 정의
 
// 위에서 정의된 객체를 byte 배열로 만들 때 필요한 byte 크기를 받는다.
    long size = testProtoObj.ByteSizeLong(); 
 
    LOGD("Test Proto After make. size:%d"size);
 
     // 확인한 크기로 버퍼를 만든다.
     char * buffer = new char[size];
     // buffer 에 바이트 배열 데이터를 얻어 온다.
     testProtoObj.SerializeToArray(buffer, size);
     LOGD("Test Proto After make. strTemp:%s", buffer);
     delete[] buffer;
}
 
void protoObjTest::makeOneObj(test::PeriodicPos *obj){
    obj->set_engineonoffstatus(test::PeriodicPos::EngineOnOffStatus::PeriodicPos_EngineOnOffStatus_ON);
    obj->set_rundistance(2000000);
    obj->set_timefor1stpos("20190109201201");
    obj->set_intervaltimeforpos(10);
 
    for(int idx = 0; idx  12; idx++){
        test::PeriodicPos::Pos *pos = obj->add_poslist();
        pos->set_lat(127.1261233);
        pos->set_lon(37.4498712);
        pos->set_speed(10+idx);
    }
}
cs

 


# Serialize 된 byte 배열 정보를 객체화 시키는 예제.

Serialize 된 정보가 test.txt 파일에 만들어져 있는 것을 객체화 시키는 방법이다.

통신으로 받은 데이터 역시 유사한 방법으로 처리하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void protoObjTest::testReadFileForObjBin(){
    std::string filePath = "/home/XXXXX/testProtoObjBin/test.txt";
    {
      // 원복한 데이터 저장을 위한 객체 정의
      test::PeriodicPos tempPosList;
      //파일에서 데이터 읽어 온다.
      std::fstream input(filePath, std::ios::in | std::ios::binary);
 
      //byte 정보를 객체화 시킨다. 에러가 발생 시 true가 리턴된다.
      if (!tempPosList.ParseFromIstream(&input)) {
        LOGD("Failed to parse tempPosList."0);
        return;
      }
      // 객체 데이터 확인을 위한 출력 코드 아래쪽 추가 설명 참조.
      std::string strTemp = ProtoToJson(tempPosList);
      LOGD("Test Proto After make. strTemp:%s", strTemp.c_str());
    }
}
cs

 

# protobuf 객체는 json형태로 출력이 가능하다.

디버깅을 위하여 사용할 수 있어 찾아봤던 함수를 같이 샘플로 남긴다.

api는 아래 include가 필요하다.

#include "google/protobuf/util/json_util.h"

1
2
3
4
5
6
7
std::string protoObjTest::ProtoToJson(const google::protobuf::Message& proto)
{
  std::string json;
  // 객체의 정보를 스트링 형태로 얻어 오는 함수 이다.
  google::protobuf::util::MessageToJsonString(proto, &json);
  return json;
}
cs

# 주의 사항

1. protobuf 메모리 누수 관련 사항이 검색을 통하여 찾아보면 상당수 있다.

코드 구현 시 메모리 누수 가 없는지 체크를 진행하여야 할 것이다.

 

2. google protobuf 사용을 위하여 메모리가 필요한데 32bit 마이컴들은 적용이 불가한 것 같다.

rom/ram 사이즈 문제

32bit mcu 를 위하여 nanopb 라는 것을 사용할 수 있다고 한다.

https://stackoverflow.com/questions/11008058/using-google-protocol-buffers-in-arduino

https://jpa.kapsi.fi/nanopb/docs/

https://github.com/nanopb/nanopb

https://techtutorialsx.com/2018/10/19/esp32-esp8266-arduino-protocol-buffers/ -> 32bit mcu관련 사항




반응형