Разбор Python ответа Protobuf из веб-сокета - PullRequest
0 голосов
/ 05 июля 2018

Я использую следующую схему прото для взаимодействия с сервером. Python Клиент использует WebSocket Client для подключения.

syntax = "proto3";
package messages;
import "any.proto";

// ................................

message GeneralResponse {
    oneof response {
        MainResponseA registrationResponse = 1;
        MainResponseB connectResponse = 2;
    }
}

message MainResponseA {
    bytes bytesA = 1;
    int64 timeLeave = 2; 
}


message GeneralMessage {
    fixed32 identifier = 1;
    oneof contents {
        GeneralResponse response = 1;
        GeneralState generalState = 2;
    }
}
// ................................

После успешного подключения и нескольких запросов (все в порядке) я получаю следующий ответ соответствующим методом on_message.

@staticmethod
def on_message(ws, message):
    logging.debug("Source Message: %s \n \n", message)

    // 2) This lines parse Message and only identifier,
    //    not inner Response Objects, with other info

    gen_msg = messages.GeneralMessage()
    gen_msg.ParseFromString(message)
    logging.info('Received Msg: %s',
        gen_msg)

В исходном сообщении, как вы можете видеть ниже, я получил большое закодированное сообщение.

    �"�R�2018 12:38:22 PM Source Message: 
    �   
    �   �PNG

    IHDRk�XTPLTE���U��~�IDATx����n$+����wg����SW"��8�YXeW#H�?J)��RJ)��RJ)��RJ)��RJ)��RJ�V����3Փϼ?��+�|<��%�U��O��\����wW�`9����Z ����X�%XH0���c��Q.L`
                                          ����VXW������CDWh�|�
    �3���$n-�io��P�fa��4�   �廖���fP���V��O�Kf�X�``
                                                    )L�����g9�����=� ��v��2w��c���( �gk��#���SVa?�jc&Kp�7!~��IR�            
  // And so on ............

Позже, после разбора этого объекта на объект Protobuf, у меня есть только идентификатор! И никаких внутренних Объектов, где я предполагаю иметь поля bytesA и timeLeave. Есть идеи, что тут не так?

07/06/2018 12:38:22 PM Received Msg: identifier: 1387340418
response {
  registrationResponse {
  }
}

1 Ответ

0 голосов
/ 13 июля 2018

Таким образом, проблема заключалась в несинхронизированной версии схемы Protobuf с сервером. И они отправили объекты с другими полями во внутренний ответ.

...