Как использовать сообщение, включающее определение пользовательского формата, с буфером протокола для Python - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь разработать клиент с использованием буферов протокола для связи с сервером через соединение 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 для этого теста.

Я работаю на этой странице

1 Ответ

0 голосов
/ 11 декабря 2018

protobuf3, который вы использовали, является архивным проектом https://github.com/Pr0Ger/protobuf3. Пожалуйста, используйте pypi.org/project/protobuf.

...