2016-08-29 8 views
0

Javaプログラムがパブリッシャーでnodejsプログラムがサブスクライバであるパブリッシュ/サブスクライブ・アプリケーションを開発しようとしています。 JavaクライアントはMQTTサーバーに接続し、ランダムなデータを送信します。 NodeJSクライアントは、Javaクライアントが登録したトピックにサブスクライブする必要があります。 JavaクライアントからNodeJSコンソールにデータを取得していますが、そのデータをWebページに非同期で出力する必要があります。nodejsとjavaを非同期で使用してMQTTデータを取得する

これは私が書いたコードです。

MqttPublishSample.java

public class MqttPublishSample { 

    public static void main(String[] args) { 

     String topic = "MQTT-Examples"; 
     String content = "HelloWorld"; 
     int qos = 2; 
     int i =0; 
     String broker = "tcp://localhost:1883"; 
     String clientId = "JavaSample"; 
     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"); 
      while(i < 100) 
      {       
       int num = (int) (Math.random() * 2); 
       String text = content + num; 
       System.out.println("Publishing message: "+content+ " "+ num); 
       MqttMessage message = new MqttMessage(text.getBytes()); 
       message.setQos(qos); 
       sampleClient.publish(topic, message); 
       System.out.println("Message published"); 
       i++; 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      // System.out.println("Publishing message: " + content); 

      /*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(); 
     } 
    } 
} 

app.js

var express = require('express'); 
var app = express(); 

app.get('/', function (req, res) { 
    client.on('connect', function() { 
     console.log("Connection Successful"); 
     client.subscribe('MQTT-Examples'); 

    }); 
    var content; 
    client.on('message', function (topic, message) { 
    content = message; 
     console.log(message.toString()); 
    }); 
res.render('index', { title: content }); 
}); 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!'); 
}); 

私は、Webページ上のメッセージを印刷してみましたが、私は任意のメッセージを見ることができません。 ウェブページ上のデータを非同期で印刷する必要があります。どのように進めるかに関する助け。ありがとう!

答えて

0

例えばclient.onのコールバックの内側のラインres.render('index', { title: content });を移動してみてください:

var express = require('express'); 
 
var app = express(); 
 

 
/* 
 
* MQTT Client 
 
*/ 
 
var content = ""; //buffer 
 

 
client.on('connect', function() { 
 
    console.log("Connection Successful"); 
 
    client.subscribe('MQTT-Examples'); 
 
}); 
 

 
client.on('message', function(topic, message) { 
 
    content += message.toString() + "<br>"; 
 
    console.log(message.toString()); 
 

 
}); 
 

 
/* 
 
* Express 
 
*/ 
 
app.get('/', function(req, res) { 
 
    res.render('index', { 
 
    title: content 
 
    }); 
 
}); 
 

 
app.listen(3000, function() { 
 
    console.log('Example app listening on port 3000!'); 
 
});

更新

私は、コードに更新をした、新しいコードでは、あなたができるようになりますWebページをリロードするたびに受信されたすべてのメッセージを表示します。

以前の実装では、一種の長いポーリングが行われていましたが、リソースはブローカからのメッセージを待機します。

希望します。

+0

今回は、ページが永久にリロードされます。それは、コンソールに接続成功メッセージを出力しません。クライアントメソッドを実行しているかどうかはわかりませんか? –

+0

ありがとう!出来た :) –

関連する問題