Protobuf Java метод parseFrom () зависает при получении сообщения от MQTT Server - PullRequest
1 голос
/ 02 апреля 2020

В настоящее время я пытаюсь опубликовать sh и получать сообщения Protobuf через сервер Mosquitto MQQT. Я успешно публикую правильное на сервере. Однако, когда клиент получает его, метод parseFrom () зависает и никогда не возвращается. Эта проблема очень похожа на эту , возникающую, когда сообщение Protobuf отправляется через сокет, который никогда не закрывается.

Издатель:

MqttClient adapterClient = new MqttClient(broker, clientID);
SpecsMessage.Specs protoNotifyMessage = SpecsMessage.Specs.newBuilder()
                    .setNodeType("basic")
                    .setAddress(serverSocket.getInetAddress().getHostName())
                    .setPort(serverSocket.getLocalPort())
                    .build();
MqttMessage notifyMessage = new MqttMessage(protoNotifyMessage.toString().getBytes());
adapterClient.publish("availableNodes", notifyMessage);

Подписчик:

public class TestController implements MqttCallback {
  public void messageArrived(String topic, MqttMessage message){
                System.out.println("New node connected");     
                System.out.println("Payload: \n" + new String(message.getPayload()));                           
                SpecsMessage.Specs protoMessage = SpecsMessage.Specs.parseFrom(message.getPayload());
  }
}

Я не смог найти способ указать серверу MQQT правильный способ отправки сообщения.

Я также пытался использовать метод writeDelimitedFrom ().

MqttClient adapterClient = new MqttClient(broker, clientID);
SpecsMessage.Specs protoNotifyMessage = SpecsMessage.Specs.newBuilder()
                    .setNodeType("basic")
                    .setAddress(serverSocket.getInetAddress().getHostName())
                    .setPort(serverSocket.getLocalPort())
                    .build();
ByteArrayOutputStream output = new ByteArrayOutputStream();
protoNotifyMessage.writeDelimitedTo(output);
MqttMessage notifyMessage = new MqttMessage(output.toByteArray());
adapterClient.publish("availableNodes", notifyMessage);

Однако сообщение неправильно преобразовано в байт [], вот как оно должно выглядеть:

nodeType: "basic"
address: "0.0.0.0"
port: 43101

И вот что я получаю:

basic0.0.0.0��

Есть ли способ заставить это работать, исправляя метод отправки или решая проблему преобразования byte []?

1 Ответ

2 голосов
/ 02 апреля 2020

Вы пытаетесь использовать parseFrom для анализа текстового прото. parseFrom - для анализа формата проводника.

Вместо этого отправьте прото в формате проводника - message.toByteArray().

(Если вы хотите разобрать текстовый формат, используйте TextFormat).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...