如何在MQTT协议中设置protobuf格式

how to set the protobuf format in MQTT protocol

我正在尝试通过 protobuf 定义我的 mqtt 数据包结构我使用 protobuf 实现了以下用于发布消息的代码

代码:

 package com.cupola.demo;

 import org.eclipse.paho.client.mqttv3.MqttClient;
 import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
 import org.eclipse.paho.client.mqttv3.MqttException;
 import org.eclipse.paho.client.mqttv3.MqttMessage;
 import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

public class Publish {

public static void main(String[] args) {

    Sample sas = new Sample();
    String topic = "Cupola";
    String content = sas.passMessage(24,"Noor");
    int qos = 2;
    String broker = "tcp://localhost:1883";
    String clientId = "DemoPublish";
    MemoryPersistence persistence = new MemoryPersistence();

    try {
        MqttClient sampleClient = new MqttClient(broker, clientId, persistence);
        MqttConnectOptions connOpts = new MqttConnectOptions();
        connOpts.setCleanSession(true);
        System.out.println("Connecting to broker: " + broker);
        sampleClient.connect(connOpts);
        System.out.println("Connected");
        System.out.println("Publishing message: " + content);
        MqttMessage message = new MqttMessage(content.getBytes());
        message.setQos(qos);
        sampleClient.publish(topic, message);
        System.out.println("Message published");
        sampleClient.disconnect();
        System.out.println("Disconnected");
//            System.exit(0);
        }
        catch (MqttException me) {
        System.out.println("reason " + me.getReasonCode());
        System.out.println("msg " + me.getMessage());
        System.out.println("loc " + me.getLocalizedMessage());
        System.out.println("cause " + me.getCause());
        System.out.println("excep " + me);
        me.printStackTrace();
    }
}

}

这里是调用 Publisher 函数设置的值,根据 proto 文件设置值

package com.cupola.demo;

import com.cupola.demo.CatProto.Cat;

public class Sample {

public String  passMessage(int age,String name) {

    // creating the cat
    Cat noor= CatProto.Cat.newBuilder()
            .setAge(age)
            .setName(name) 
            .build();
    String message=noor.toString();


    return message;
}

}

这是我的 Cat.proto 文件:

option java_outer_classname="CatProto";

message Cat {
optional int32 age = 1;
required string name = 2;
}

是这样还是我需要换个方式。请建议我。提前致谢。

假设您使用 Google Protobuff 库,那么您希望在 passMessage() 方法中使用 toByteArray() 而不是 toString()

public byte[]  passMessage(int age,String name) {

    // creating the cat
    Cat noor= CatProto.Cat.newBuilder()
            .setAge(age)
            .setName(name) 
            .build();
    byte message[] = noor.toByteArray();


    return message;
}