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 * It is a good idea to always initialize your structures 20 * so that you do not have garbage data from RAM in there. 21 */ 22 SimpleMessage message = SimpleMessage_init_zero; 23 24 /* Create a stream that will write to our buffer. */ 25 pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer)); 26 27 /* Fill in the lucky number */ 28 message.lucky_number = 13; 29 30 /* Now we are ready to encode the message! */ 31 status = pb_encode(&stream, SimpleMessage_fields, &message); 32 message_length = stream.bytes_written; 33 34 /* Then just check for any errors.. */ 35 if (!status) 36 { 37 printf("Encoding failed: %s\n", PB_GET_ERROR(&stream)); 38 return 1; 39 } 40 } 41 42 /* Now we could transmit the message over network, store it in a file or 43 * wrap it to a pigeon's leg. 44 */ 45 46 /* But because we are lazy, we will just decode it immediately. */ 47 48 { 49 /* Allocate space for the decoded message. */ 50 SimpleMessage message = SimpleMessage_init_zero; 51 52 /* Create a stream that reads from the buffer. */ 53 pb_istream_t stream = pb_istream_from_buffer(buffer, message_length); 54 55 /* Now we are ready to decode the message. */ 56 status = pb_decode(&stream, SimpleMessage_fields, &message); 57 58 /* Check for errors... */ 59 if (!status) 60 { 61 printf("Decoding failed: %s\n", PB_GET_ERROR(&stream)); 62 return 1; 63 } 64 65 /* Print the data contained in the message. */ 66 printf("Your lucky number was %d!\n", message.lucky_number); 67 } 68 69 return 0; 70 } 71 72