1 #include <stdio.h> 2 #include <pb_encode.h> 3 #include <pb_decode.h> 4 #include "simple.pb.h" 5 6 int main() 7 { 8 /* This is the buffer where we will store our message. */ 9 uint8_t buffer[128]; 10 size_t message_length; 11 bool status; 12 13 /* Encode our message */ 14 { 15 /* Allocate space on the stack to store the message data. 16 * 17 * Nanopb generates simple struct definitions for all the messages. 18 * - check out the contents of simple.pb.h! */ 19 SimpleMessage message; 20 21 /* Create a stream that will write to our buffer. */ 22 pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer)); 23 24 /* Fill in the lucky number */ 25 message.lucky_number = 13; 26 27 /* Now we are ready to encode the message! */ 28 status = pb_encode(&stream, SimpleMessage_fields, &message); 29 message_length = stream.bytes_written; 30 31 /* Then just check for any errors.. */ 32 if (!status) 33 { 34 printf("Encoding failed: %s\n", PB_GET_ERROR(&stream)); 35 return 1; 36 } 37 } 38 39 /* Now we could transmit the message over network, store it in a file or 40 * wrap it to a pigeon's leg. 41 */ 42 43 /* But because we are lazy, we will just decode it immediately. */ 44 45 { 46 /* Allocate space for the decoded message. */ 47 SimpleMessage message; 48 49 /* Create a stream that reads from the buffer. */ 50 pb_istream_t stream = pb_istream_from_buffer(buffer, message_length); 51 52 /* Now we are ready to decode the message. */ 53 status = pb_decode(&stream, SimpleMessage_fields, &message); 54 55 /* Check for errors... */ 56 if (!status) 57 { 58 printf("Decoding failed: %s\n", PB_GET_ERROR(&stream)); 59 return 1; 60 } 61 62 /* Print the data contained in the message. */ 63 printf("Your lucky number was %d!\n", message.lucky_number); 64 } 65 66 return 0; 67 } 68 69