如何在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;
}
我正在尝试通过 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;
}