[Nanopb] Array Sub message - Encode example code
반응형
Encode sample code (Array Sub message sample)
※ 관련글
- Google Protobuf
- [Google Protobuf] For Java in Android Studio - 설치 및 proto 파일 컴파일
- [Google Protobuf] For Java in Android Studio - Gen Java 파일 Android Studio 적용
- [Google Protobuf] For Java in Android Studio - Basic example code 기본 소스 코드 사용 샘플
- [Google Protobuf] For C++ in Linux - Settings C++ 빌드 환경 만들기
- [Google Protobuf] For C++ in Linux - Basic example code 기본 소스 코드 사용 샘플
- Nanopb Basic type value example
- [Nanopb for Google protobuf] Basic type proto sample
- [Nanopb for Google protobuf] Basic type proto sample - Sample proto file
- [Nanopb for Google protobuf] Basic type proto sample - Encode sample code
- [Nanopb for Google protobuf] Basic type proto sample - Decode sample code
- Nanopb String / bytes value example
- [Nanopb for Google protobuf] String/Bytes type proto
- [Nanopb for Google protobuf] String/Bytes type proto - Sample proto file
- [Nanopb for Google protobuf] String/Bytes type proto - Encode example code 1
- [Nanopb for Google protobuf] String/Bytes type proto - Encode example code 2
- [Nanopb for Google protobuf] String/Bytes type proto - Decode example code
- Nanopb basic submsg example
- [Nanopb for Google protobuf] Sub message - Example proto file
- [Nanopb for Google protobuf] Sub message - Encode example code
- [Nanopb for Google protobuf] Sub message - Decode example code
- Nanopb array submsg value example
- [Nanopb for Google protobuf] Array Sub message - Example proto file
- [Nanopb for Google protobuf] Array Sub message - Encode example code
- [Nanopb for Google protobuf] Array Sub message - Decode example code
* proto file struct
TestSubMsgArr - int32 testInt32 SubArrMsg submsg[]
위 형태의 데이터를 encode 시키기 위한 샘플이다.
내부 TestMsgST struct 타입을 선언하여 데이터 전달을 한다.
encode callback 호출 시 array size만큼 put 을 시킨다.
* encode main 함수
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
void testSubMsgArrEncode(){
int encodeSize = 0;
// Proto Gen에서 생성된 submsg 저장을 위한 내부 구조체 변수 선언.
TestMsgST testMsgSt;
// 변수 초기화
testMsgSt.subMsgCount = 0;
for(int idx = 0; idx < 5; idx++){
putDataSubMsg(testMsgSt, 101.101+idx, 30+idx);
}
//Proto file에서 생성된 부모 struct 생성
TestSubMsgArr msg = TestSubMsgArr_init_default;
// 부모 변수에 값 대임
msg.testInt32 = 321;
// submsg 객체 encoding api 입력
msg.submsg.funcs.encode = &encode_WithStruct;
// submsg 객체 encoding api 에 전달될 내부 구조체 변수 입력
msg.submsg.arg = &testMsgSt;
// Decode 시키기 위한 버퍼 및 stream 생성
uint8_t buffer[100];
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
/* stream 과 메시지로 Encode 시킨다. 실패 시 false가 리턴된다.
* encode api 호출 시 위에서 입력된 submsg encode 함수가 호출 된다. */
if (pb_encode(&stream, TestSubMsgArr_fields, &msg)) {
encodeSize = stream.bytes_written;
Serial.print("TestSubMsgArr encode OK size:");
Serial.print(encodeSize);
Serial.println("");
Serial.print("SubMsgArr Bytes: ");
// encode된 데이터 바이트 값 출력.
for (int i = 0; i < encodeSize; i++) {
Serial.print(buffer[i], 16);
Serial.print(" ");
}
Serial.println("");
// decode 시킨다.
testDecodeSubMsgArr(encodeSize, buffer);
} else {
Serial.print("TestSubMsgArr Encoding failed: ");
Serial.print(PB_GET_ERROR(&stream));
Serial.println("");
return;
}
}
|
cs |
* submsg encode callback 함수 등록을 위한 함수
arg 로 위 main encode 에서 넣어준 TestMsgST struct 타입의 데이터가 전달된다.
이것의 사이즈 만큼 pb_encode_submessage를 하여 넣는다.
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
|
// Encode api with internal struct buffer.
bool encode_WithStruct(pb_ostream_t *stream, const pb_field_t *field, void * const *arg)
{
// 전달된 arg 값을 내부 struct 형으로 변경.
TestMsgST *sourceStArr = (TestMsgST*)(*arg);
Serial.println("encode_WithStruct start @@@");
// encode all array data
for ( int i = 0; i < sourceStArr->subMsgCount; i++){
if (!pb_encode_tag_for_field(stream, field)) {
Serial.print("encode_WithStruct encode tag failed:");
Serial.println(PB_GET_ERROR(stream));
return false;
}
SubArrMsg subMsg = SubArrMsg_init_default;
subMsg.subDoubleValue = sourceStArr->subMsg[i].subDoubleValue;
subMsg.subInt32Value = sourceStArr->subMsg[i].subInt32Value;
if (!pb_encode_submessage(stream, SubArrMsg_fields, &subMsg)) {
Serial.print("encode_WithStruct pb_encode_SubArrMsg failed:");
Serial.println(PB_GET_ERROR(stream));
return false;
}
}
return true;
}
|
cs |
반응형
'IT > C, C++' 카테고리의 다른 글
[아두이노(Arduino)] hex(byte array) print api example (0) | 2020.02.04 |
---|---|
[Nanopb] Array Sub message - Decode example code (0) | 2020.01.30 |
[Nanopb] Array Sub message - Example proto file (0) | 2020.01.30 |
[Nanopb] Sub message - Decode example code (0) | 2020.01.30 |
[Nanopb for Google protobuf] Sub message - Encode example code (0) | 2020.01.30 |