node.js 和 java 之间的 mqtt 通信
mqtt communication between node.js and java
目标是使用mqtt协议发送数据。 Java 项目 (tempSensor) 使用 mqtt 协议生成温度值,node.js 使用 mqtt 订阅温度值。 node.js 和 java 项目都对 publish/subscribe 使用相同的密钥。我可以使用 java 项目发布数据,也可以在 node.js 中订阅数据。但数据不是可读格式。怎么做 ?所以数据是可读的格式。
TempStruct 的结构如下:
public class TempStruct implements Serializable {
private static final long serialVersionUID = 1L;
private double tempValue;
public double gettempValue() {
return tempValue;
}
private String unitOfMeasurement;
public String getunitOfMeasurement() {
return unitOfMeasurement;
}
public TempStruct(double tempValue, String unitOfMeasurement) {
this.tempValue = tempValue;
this.unitOfMeasurement = unitOfMeasurement;
}
public String toJSON() {
String json = String.format("{'tempValue': %f, 'unitOfMeasurement': '%s'}", tempValue, unitOfMeasurement);
return json;
}
}
使用mqtt发布数据的代码如下:
Logger.log(myDeviceInfo.getName(), "TemperatureSensor",
"Publishing tempMeasurement");
System.out.println("JSON Value...."+newValue.toJSON());
try {
this.myPubSubMiddleware.publish("tempMeasurement",
newValue.toJSON().getBytes("utf-8"), myDeviceInfo);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
使用mqtt接收数据的代码如下:(Node.js)
var mqtt=require('mqtt');
var client=mqtt.connect('mqtt://test.mosquitto.org:1883');
var data;
client.subscribe('tempMeasurement');
client.on('message',function(topic,payload){
//arg=JSON.stringify(arg);
console.log("In Message......");
var tempStruct = JSON.parse(payload);
console.log("tempValue: "+tempStruct.tempValue);
});
错误截图如下:
MQTT 消息负载只是字节数组,因此您需要了解消息在发送端和接收端的编码方式。在这种情况下,不清楚您发送的是什么,因为您发布的代码只是传递了一个 Java 对象。
图片中的错误消息表明对象的 Java 序列化版本正在作为消息负载发送。虽然这将包含您需要的信息,但在 Java 脚本中重新组装它会非常困难。
假设 TempStruct
对象看起来像这样:
public class TempStruct {
int value = 0;
String units = "C";
public void setValue(int val) {
value = val;
}
public int getValue() {
return value;
}
public void setUnits(String unit) {
units = unit;
}
public String getUnits() {
return units;
}
}
那么你应该添加以下方法:
public String toJSON() {
String json = String.format("{'value': %d, 'units': '%s'}", value, units);
return json;
}
然后按如下方式编辑您的 Java 发布代码:
...
this.myPubSubMiddleware.publish("tempMeasurement", newValue.toJSON().getBytes("utf-8"),
myDeviceInfo);
...
并像这样更改您的 Java脚本:
...
client.on('message',function(topic,payload){
console.log("In messgage....");
var tempStruct = JSON.parse(payload.payloadString)
console.log("tempValue: "+tempStruct.value);
});
...
编辑:
将 getBytes("utf-8") 添加到 Java 代码以确保我们只是将字符串字节放入消息中。
EDIT2:抱歉,混淆了 paho 网络客户端和 npm mqtt 模块,Java脚本应该是:
...
client.on('message',function(topic,payload){
console.log("In messgage....");
var tempStruct = JSON.parse(payload.toString())
console.log("tempValue: "+tempStruct.value);
});
...
最后我能够解决 problem.On 接收方,我们需要将字节转换为可读字符串,然后使用 JSON 解析器解析可读。解决方案如下:
var mqtt=require('mqtt');
var client=mqtt.connect('mqtt://test.mosquitto.org:1883');
client.subscribe('tempMeasurement');
client.on('message',function(topic,payload){
if(topic.toString()=="tempMeasurement"){
console.log("Message received");
var data =payload.toString('utf8',7);
var temp=JSON.parse(data);
console.log(temp.tempValue,temp.unitOfMeasurement);
//console.log(data);
}
});
目标是使用mqtt协议发送数据。 Java 项目 (tempSensor) 使用 mqtt 协议生成温度值,node.js 使用 mqtt 订阅温度值。 node.js 和 java 项目都对 publish/subscribe 使用相同的密钥。我可以使用 java 项目发布数据,也可以在 node.js 中订阅数据。但数据不是可读格式。怎么做 ?所以数据是可读的格式。 TempStruct 的结构如下:
public class TempStruct implements Serializable {
private static final long serialVersionUID = 1L;
private double tempValue;
public double gettempValue() {
return tempValue;
}
private String unitOfMeasurement;
public String getunitOfMeasurement() {
return unitOfMeasurement;
}
public TempStruct(double tempValue, String unitOfMeasurement) {
this.tempValue = tempValue;
this.unitOfMeasurement = unitOfMeasurement;
}
public String toJSON() {
String json = String.format("{'tempValue': %f, 'unitOfMeasurement': '%s'}", tempValue, unitOfMeasurement);
return json;
}
}
使用mqtt发布数据的代码如下:
Logger.log(myDeviceInfo.getName(), "TemperatureSensor",
"Publishing tempMeasurement");
System.out.println("JSON Value...."+newValue.toJSON());
try {
this.myPubSubMiddleware.publish("tempMeasurement",
newValue.toJSON().getBytes("utf-8"), myDeviceInfo);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
使用mqtt接收数据的代码如下:(Node.js)
var mqtt=require('mqtt');
var client=mqtt.connect('mqtt://test.mosquitto.org:1883');
var data;
client.subscribe('tempMeasurement');
client.on('message',function(topic,payload){
//arg=JSON.stringify(arg);
console.log("In Message......");
var tempStruct = JSON.parse(payload);
console.log("tempValue: "+tempStruct.tempValue);
});
错误截图如下:
MQTT 消息负载只是字节数组,因此您需要了解消息在发送端和接收端的编码方式。在这种情况下,不清楚您发送的是什么,因为您发布的代码只是传递了一个 Java 对象。
图片中的错误消息表明对象的 Java 序列化版本正在作为消息负载发送。虽然这将包含您需要的信息,但在 Java 脚本中重新组装它会非常困难。
假设 TempStruct
对象看起来像这样:
public class TempStruct {
int value = 0;
String units = "C";
public void setValue(int val) {
value = val;
}
public int getValue() {
return value;
}
public void setUnits(String unit) {
units = unit;
}
public String getUnits() {
return units;
}
}
那么你应该添加以下方法:
public String toJSON() {
String json = String.format("{'value': %d, 'units': '%s'}", value, units);
return json;
}
然后按如下方式编辑您的 Java 发布代码:
...
this.myPubSubMiddleware.publish("tempMeasurement", newValue.toJSON().getBytes("utf-8"),
myDeviceInfo);
...
并像这样更改您的 Java脚本:
...
client.on('message',function(topic,payload){
console.log("In messgage....");
var tempStruct = JSON.parse(payload.payloadString)
console.log("tempValue: "+tempStruct.value);
});
...
编辑:
将 getBytes("utf-8") 添加到 Java 代码以确保我们只是将字符串字节放入消息中。
EDIT2:抱歉,混淆了 paho 网络客户端和 npm mqtt 模块,Java脚本应该是:
...
client.on('message',function(topic,payload){
console.log("In messgage....");
var tempStruct = JSON.parse(payload.toString())
console.log("tempValue: "+tempStruct.value);
});
...
最后我能够解决 problem.On 接收方,我们需要将字节转换为可读字符串,然后使用 JSON 解析器解析可读。解决方案如下:
var mqtt=require('mqtt');
var client=mqtt.connect('mqtt://test.mosquitto.org:1883');
client.subscribe('tempMeasurement');
client.on('message',function(topic,payload){
if(topic.toString()=="tempMeasurement"){
console.log("Message received");
var data =payload.toString('utf8',7);
var temp=JSON.parse(data);
console.log(temp.tempValue,temp.unitOfMeasurement);
//console.log(data);
}
});