在我当前的项目中,我们尝试如下实现两个软件组件之间的通信。在这里,Temperaturesensor
(用JavaSE
编写)组件定期发布用MQTT JavaSE Publisher编写的传感器测量结果。并且CalculateTemp
(用Nodejs
编写)组件已使用MQTT Nodejs订阅并接收了数据。我的问题是-当在CalculateAvgTemp
组件处接收到的数据为垃圾邮件时(可能是TemperatureSensor
在byte[]
中发送数据并且在calculateAvgTemp
组件侧,数据未从byte[]
转换而来.--如何将byte []数据转换为JSON格式?TemperatureSensor
处的Publish方法如下。请注意,在发布到MQTT代理之前,数据将转换为字节。
public void publish(String topicName, Object arg, Device deviceInfo) {
DataWrapper dw = new DataWrapper();
dw.setObject(arg);
dw.setDevice(deviceInfo);
java.io.ByteArrayOutputStream bstream = new java.io.ByteArrayOutputStream();
java.io.ObjectOutputStream st;
try {
st = new java.io.ObjectOutputStream(bstream);
st.writeObject(dw);
st.flush();
} catch (IOException e) {
e.printStackTrace();
}
byte[] bytes = bstream.toByteArray();
try {
pub.publish(topicName, 0, bytes);
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在数据接收方
CalculateAvgTemp
上,代码如下:var mqtt = require('mqtt'); // no count for NodeRED
var client = mqtt.connect('mqtt://test.mosquitto.org:1883');
var NUM_SAMPLE_FOR_AVG = 5;
var numSample = 0;
var tempCelcius = 0;
var currentAvg = 0;
client.subscribe('tempMeasurement');
client.on('message', function(topic, payload) {
if (topic.toString() == "tempMeasurement") {
// Here, we may need to convert the byte[] array.
// But I do not know-- how can I convert byte[] array to JSON.
var sensorMeasurement=JSON.parse(payload);
if (numSample <= NUM_SAMPLE_FOR_AVG) {
numSample = numSample + 1;
if (sensorMeasurement.unitOfMeasurement == 'F') {
tempCelcius = ((sensorMeasurement.tempValue - 32) * (5 / 9));
} else {
tempCelcius = sensorMeasurement.tempValue;
}
currentAvg = parseFloat(currentAvg) + parseFloat(tempCelcius);
if (numSample == NUM_SAMPLE_FOR_AVG) {
currentAvg = currentAvg / NUM_SAMPLE_FOR_AVG;
var avgTemp = {
"tempValue" : parseFloat(currentAvg),
"unitOfMeasurement" : sensorMeasurement.unitOfMeasurement
};
client.publish('roomAvgTempMeasurement', JSON
.stringify(avgTemp));
console.log("Publishing Data roomAvgTempMeasurement ");
numSample = 0;
currentAvg = 0;
}
}
}
});
可能重复的问题是MQTT communication between nodejs and java
但是,建议的解决方案不起作用,或者我无法清楚地理解它可以解决问题。
最佳答案
ObjectOutputStream将对象转换为序列化的Java Object流,这是Java的内部对象表示法,其他任何东西都无法理解(轻松地)。
您需要使用像json.org中的库那样的库来构建一个与DataWrapper对象保持相同状态的JSON对象(或如链接的问题所示,以一个字符串形式手动构建一个对象),然后输出JSON对象作为可以作为MQTT消息的字节有效载荷发送的字符串。