2015-10-30 60 views
0

目標是使用mqtt協議發送數據。 Java項目(tempSensor)使用mqtt協議和使用mqtt預訂tempvalue的node.js生成臨時值。 node.js和java項目都使用相同的密鑰進行發佈/訂閱。我能夠使用java項目發佈數據,並且還可以在node.js中訂閱數據。但數據不是可讀格式。怎麼做 ?所以數據的格式是可讀的。 結構TempStruct是如下:node.js和java之間的mqtt通信

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); 
}); 

錯誤快照如下所示: Error from Node.js console

+0

您必須將數據轉換爲不同的數據。 JSON可能是一個不錯的選擇 – Nitek

+0

@ Nitek-將盡力回覆你。謝謝 – abc

+0

@ Nitek - 請你檢查後回答我?謝謝 – abc

回答

-2

最後我能夠解決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); 
} 
}); 
+0

這與我幾個星期前給出的答案沒有什麼不同 – hardillb

+0

@ hardillb-你是對的,但在這裏是它的一個實現。謝謝。 – abc

2

MQTT消息有效載荷只是字節數組,因此您需要了解消息在發送端和接收端的編碼方式。在這種情況下,由於您發佈的代碼只是傳遞一個Java對象,因此不清楚您要發送的內容。

圖中的錯誤消息意味着該對象的Java序列化版本正在作爲消息有效載荷發送。雖然這將包含您需要使用JavaScript重新組裝它的信息,但這將非常困難。

假設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); 
... 

並改變你的JavaScript這樣的:

... 
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:對不起,夾雜了故宮MQTT模塊泛美衛生組織的Web客戶端,JavaScript的應該是:

... 
client.on('message',function(topic,payload){ 
    console.log("In messgage...."); 
    var tempStruct = JSON.parse(payload.toString()) 
    console.log("tempValue: "+tempStruct.value);   
}); 
... 
+0

@ hardillb-會盡力回覆你。謝謝你的迴應.. – abc

+0

@ hardillb-仍然沒有效果...錯誤的部分如下所示:undefined:1 �� ^ SyntaxError:意外的令牌 – abc

+0

我一直堅持和編輯在我認爲現在應該工作,但沒有看到你已經改變了我不能猜到 – hardillb