Я пытаюсь кодировать classi c Пример "AddressBook.proto", найденный здесь , используя NanoPB. Мне удалось создать работающий пример кодирования / декодирования в ESP32 с использованием синтаксиса proto 2. Теперь мне нужно работать с синтаксисом «proto3», и я соответствующим образом преобразовал синтаксис файла .proto. Существует проблема, что я не знаю, как адрес о перечисление кодирования: при использовании синтаксиса proto2 все работает хорошо, при использовании proto3 синтаксиса процесс кодирования, кажется, не кодировать перечисление (PHONETYPE) правильно, вот что происходит:
- Значение по умолчанию / «Ноль» кодируется правильно (в кодированных байтах отсутствует часть (все должно быть в порядке, по умолчанию Ноль);
- Первое значение перечисления (индекс 1) кажется, работает правильно (закодировано нормально);
- От перечислений с индексом 2 до n , это не работает, и закодированные данные остаются точно такими же, как если бы выбранное перечисление было первым (индекс 1).
Пока что это источник файла .proto (преобразован для синтаксиса 3):
syntax = "proto3";
message Person {
string name = 1;
int32 id = 2;
string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
repeated PhoneNumber phone = 4;
}
message AddressBook {
repeated Person person = 1;
}
Это создание, встроенное в пример код для новых структур человек / номер телефона:
Person person_dec = Person_init_default;
person_enc.id=37;
person_enc.name.arg="Jack";
person_enc.name.funcs.encode=&encode_string;
person_enc.email.arg="email@test.com";
person_enc.email.funcs.encode=&encode_string;
Person_PhoneNumber phoneno = Person_PhoneNumber_init_default;
#ifdef USING_PROTO2
phoneno.has_type=true;
#endif
phoneno.number.arg="1234567890";
phoneno.number.funcs.encode=&encode_string;
phoneno.type=Person_PhoneType_WORK; //has no effect here
person_enc.phone.funcs.encode=&encode_phone;
person_enc.phone.arg=&phoneno;
Тогда это обратный вызов encode_phone (работает правильно с использованием синтаксиса proto2):
bool encode_phone(pb_ostream_t* stream, const pb_field_t* field, void* const* arg){
printf("Encoding phone number\n");
const Person_PhoneNumber *pno = (const Person_PhoneNumber*)(*arg);
if (!pb_encode_tag_for_field(stream, field))
return false;
return pb_encode_submessage(stream,Person_PhoneNumber_fields, pno);
}
Чего мне не хватает?