2013-03-18 3 views
3

Мне нужно использовать 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-с?

ответ

2

Самоописательные сообщения - это скорее особый случай, я не думаю, что вы должны использовать их здесь, даже если они были поддержаны. Проточные буферы имеют очень хорошую поддержку для расширения сообщений позже, вы можете просто добавить новые необязательные поля для новых типов запросов.

Вам необязательно нужны эти поля ValueType и RequestType. Вместо этого вы можете просто проверить, присутствует ли каждое поле (has_value_int8 и т. Д.).

Ваше сообщение с запросом будет использовать шаблон дизайна «Union Message». Если вы хотите сохранить память, вы можете использовать механизм обратного вызова nanopb для привязки функций к каждому из типов запросов.

+0

Спасибо за ответ. Что относительно Сервиса? Будет ли совместимый сервер, написанный с помощью nanopb с клиентом, созданный директивой 'services' в .proto-файле? – CkopIIuoH

+0

nanopb в настоящее время не поддерживали ключевое слово 'service'. Кроме того, буферы протокола не определяют реализацию для 'service', поэтому она не будет совместима в разных библиотеках. Я не рекомендую вообще использовать ключевое слово 'service'. – jpa

+0

Спасибо. Поэтому я просто не понял смысла слова «service» ... (Это мой первый опыт работы с protobuf). Я думаю, что это необходимо для совместимости между различными реализациями ... – CkopIIuoH

Смежные вопросы