在我当前的项目中,我们尝试如下实现两个软件组件之间的通信。在这里,Temperaturesensor(用JavaSE编写)组件定期发布用MQTT JavaSE Publisher编写的传感器测量结果。并且CalculateTemp(用Nodejs编写)组件已使用MQTT Nodejs订阅并接收了数据。我的问题是-当在CalculateAvgTemp组件处接收到的数据为垃圾邮件时(可能是TemperatureSensorbyte[]中发送数据并且在calculateAvgTemp组件侧,数据未从byte[]转换而来.--如何将byte []数据转换为JSON格式?

java - MQTT Java发布者和Nodejs订阅者-LMLPHP
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消息的字节有效载荷发送的字符串。

09-15 11:47