2016-08-29 4 views
0

Java 프로그램이 게시자이고 nodejs 프로그램이 구독자 인 게시/가입 애플리케이션을 개발하려고합니다. Java 클라이언트는 MQTT 서버에 연결하고 임의의 데이터를 전송합니다. NodeJS 클라이언트는 Java 클라이언트가 등록한 주제에 등록해야합니다. Java 클라이언트에서 NodeJS 콘솔로 데이터를 가져오고 있지만 웹 페이지에서 비동기 적으로 해당 데이터를 인쇄해야합니다.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(); 
     } 
    } 
} 

내가 웹 페이지에 메시지를 인쇄하려고

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

을 app.js하지만 난 모든 메시지를 볼 수 없습니다입니다. 웹 페이지의 데이터를 비동기 적으로 인쇄해야합니다. 진행 방법에 대한 도움. 감사!

답변

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

업데이트를 내가 코드를 업데이 트를했다

, 새로운 코드에서 당신은 수있을 것입니다 웹 페이지를 다시로드 할 때마다받은 모든 메시지를 볼 수 있습니다.

이전 구현에서는 일종의 긴 폴링 이었지만 리소스는 브로커의 메시지를 기다립니다.

희망이 있습니다.

+0

이번에는 페이지가 영원히 다시로드됩니다. 그것은 심지어 콘솔에 성공적으로 연결 메시지를 인쇄하지 않습니다. 클라이언트 메소드를 실행 중인지 확실하지 않습니까? –

+0

고마워요! 그것은 일했다 :) –

관련 문제