Protobuf Java方法parseFrom()从MQTT Server接收消息时挂起

问题描述 投票:0回答:1

我目前正在尝试通过Mosquitto MQQT服务器发布和接收Protobuf消息。我成功地将适当的内容发布到服务器。但是,当客户端收到它时,方法parseFrom()会挂起并且永远不会返回。这是与this one非常相似的问题,当通过永不关闭的套接字发送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 []转换问题来使这项工作有效?

java protocol-buffers mqtt mosquitto protobuf-java
1个回答
0
投票

您正在尝试使用parseFrom解析文本格式的原型。 parseFrom用于解析连线格式。

以有线格式发送原型-message.toByteArray()

((如果要从文本格式解析,请使用TextFormat

© www.soinside.com 2019 - 2024. All rights reserved.