Я пытаюсь разработать клиент с использованием буферов протокола для связи с сервером через соединение MQTT.
Я провел небольшой тест с подмножеством протокола, и он не работает.Я не могу понять, почему.
Определение протокола:
syntax = "proto2";
message EventHeader {
// Gw id that generated the event
required string gw_id = 1;
// Sink id if relevant for event
optional string sink_id = 2;
// Random event id to help duplicate event filtering
required uint64 event_id = 3;
}
enum OnOffState {
ON = 1;
OFF = 2;
}
message StatusEvent {
required EventHeader header = 1;
required uint32 version = 2;
required OnOffState state = 3;
}
Код Python, сгенерированный протоколом :
from protobuf3.message import Message
from protobuf3.fields import EnumField, StringField, UInt64Field, MessageField, UInt32Field
from enum import Enum
class EventHeader(Message):
pass
class StatusEvent(Message):
pass
class OnOffState(Enum):
ON = 1
OFF = 2
EventHeader.add_field('gw_id', StringField(field_number=1, required=True))
EventHeader.add_field('sink_id', StringField(field_number=2, optional=True))
EventHeader.add_field('event_id', UInt64Field(field_number=3, required=True))
StatusEvent.add_field('header', MessageField(field_number=1, required=True, message_cls=EventHeader))
StatusEvent.add_field('version', UInt32Field(field_number=2, required=True))
StatusEvent.add_field('state', EnumField(field_number=3, required=True, enum_cls=OnOffState))
Код Python, использующий сообщение, определенное
msg = message.StatusEvent()
header = msg.header
header.gw_id = 'gateway_test'
header.event_id=random.randint(0,2**64-1)
header.sink_id='sink_test'
msg.version = 0
msg.version = message.OnOffState.ON
Ошибка, которую я получаю :
File "/home/dc/svn/Code/APS/Application/BigBrother/trunk/Client.py", line 23, in run
header.gw_id = 'gateway_test'
File "/usr/local/lib/python3.5/dist-packages/protobuf3/fields/base.py", line 87, in __set__
self._convert_to_wire_type(value))
File "/usr/local/lib/python3.5/dist-packages/protobuf3/message.py", line 185, in _set_wire_values
msg._set_wire_values(number, FIELD_VARIABLE_LENGTH, self.encode_to_bytes(), idx)
File "/usr/local/lib/python3.5/dist-packages/protobuf3/message.py", line 204, in encode_to_bytes
self._check_required_fields()
File "/usr/local/lib/python3.5/dist-packages/protobuf3/message.py", line 159, in _check_required_fields
raise KeyError("Some required fields are missing: " + ", ".join(missing_fields))
KeyError: 'Some required fields are missing: event_id'
Не знаюЯ не понимаю, как я должен инициализировать мое сообщение с данными.Когда я пытаюсь заполнить одно поле, python систематически вылетает, сообщая мне, что сначала мне нужно инициализировать другое поле.
Я использую Python 3.5.2 для этого теста.
Я работаю на этой странице