Мне нужно использовать protobuf в встроенной системе рук. Нужна поддержка pure C. Проект будет использовать архитектуру клиент-сервер (сервер C с java, клиентами Python). Проект требует рассмотрения возможности распространения протокола. , например - такие запросы будут отправлены на сервер:protobuf RPC структура (встроенный ARM)
read <address> <type> <count> [<filename>]
write <address> <type> <value>
...
, где адрес, длина, тип, значение - требуется; filename - необязательно. Запрос должен содержать одну из команд: писать, читать ... (но не более одного). Я думаю, что это должно быть что-то вроде этого:
message WriteRequest {
enum ValueType {
INT8 = 0 [(string)="int8"];
INT16 = 1 [(string)="int16"];
INT32 = 2 [(string)="int32"];
INT64 = 3 [(string)="int64"];
FLOAT32 = 4 [(string)="float32"];
FLOAT64 = 5 [(string)="float64"];
BYTEARRAY = 6 [(string)="bytearray"];
}
required uint64 address = 1;
required ValueType value_type = 2 [default = INT32];
optional int32 value_int8 = 3;
optional int32 value_int16 = 4;
optional int32 value_int32 = 5;
optional int32 value_int64 = 6;
optional float value_float32 = 7;
optional double value_float64 = 8;
optional bytes value_bytearray = 9;
}
...
message Request {
enum RequestType {
READ_REQUEST = 1;
WRITE_REQUEST = 2;
...
}
required RequestType request_type = 1;
optional ReadRequest read = 3;
optional WriteRequest write = 4;
...
}
Я думаю, что лучший выбор в этом случае - nanopb (http://koti.kapsi.fi/jpa/nanopb/). На мой взгляд, код nanopb написан очень хорошо.
Как я понимаю, nanopb не поддерживает самоописательные сообщения. Или любые методы отражения. Вот почему я выбрал эту структуру. Является ли эта структура оптимальной для этого случая? Может быть проблема в будущем? если потребуется продлить протокол для новых команд (например: listStatus <id> <verbose>
)?
При использовании в качестве сервера nanopb (например: http://code.google.com/p/nanopb/source/browse/example/server.c), смогу ли я использовать его в качестве клиента? (Как я понимаю, nanopb не поддерживает услуги в .proto.):
service MyService {
rpc Search (Request) returns (Response);
}
PS: Стоит ли использовать Protobuf-с?
Спасибо за ответ. Что относительно Сервиса? Будет ли совместимый сервер, написанный с помощью nanopb с клиентом, созданный директивой 'services' в .proto-файле? – CkopIIuoH
nanopb в настоящее время не поддерживали ключевое слово 'service'. Кроме того, буферы протокола не определяют реализацию для 'service', поэтому она не будет совместима в разных библиотеках. Я не рекомендую вообще использовать ключевое слово 'service'. – jpa
Спасибо. Поэтому я просто не понял смысла слова «service» ... (Это мой первый опыт работы с protobuf). Я думаю, что это необходимо для совместимости между различными реализациями ... – CkopIIuoH