2017-03-15 6 views
0

나는 센서 일 뿐인 원격 장치가 있습니다. 그것은 계속 나에게 몇 가지 숫자를 줄 것이다. 실제로 내 node.js 서버에 해당 번호가 수신되고 있습니다. 해당 데이터를 게시하고 싶지 않습니다. 클라이언트를 구독하고 싶습니다. 고객이 등록한 후 내 주제메시지을 인쇄하고 싶습니다. 여기 내 Node.js 서버와 mqtt은 입니다.입니다. 노드 app.jsgcc main.c./a.out 다음에 두 파일을 모두 실행하십시오.
이 문제를 어떻게 해결할 수 있습니까?
파일은 다음과 같습니다 :클라이언트를 구독하고 Node.js, Mosca 및 MQTT의 MongoDB에 데이터를 저장하는 방법

을 app.js

'use strict'; 

//dependencies 
var express   = require('express'), 
    passport   = require('passport'), 
    strategy   = require('passport-local').Strategy, 
    mongoose   = require('mongoose'), 
    mongodb   = require('mongodb'), 
    bodyParser  = require('body-parser'), 
    path    = require('path'), 
    acl    = require('acl'), 
    mosca   = require('mosca'); 

exports.init = function(pp) { 
    passport = pp; 
    app = pp; 
    return exports; 
}; 

exports.root = function(req, res) { 
    // Running 
    res.send("Running"); 
}; 

//create express app 
var app   = express(); 
    app.appname ="watersensor_DB"; 

//config mongoose 
    mongoose.Promise = global.Promise; 
    app.db = mongoose.createConnection('localhost/'+app.appname); 
    app.db.on('error', console.error.bind(console, 'mongoose connection error: ')); 
    app.db.once('open', function() { 
    // Store All Data 
    }); 

//config mongodb 
    mongodb.connect("mongodb://localhost/"+app.appname, function(error, mdb) { 
    app.acl=new acl(new acl.mongodbBackend(mdb, app.appname)); 
    }); 

//config data models 
    require('./models')(app, mongoose); 

//Serve Frontend 
    app.use(express.static(path.join(__dirname, '/public/'))); 

//config Routes 
    var router = express.Router(); 
    require('./routes')(app, router, passport); 

//config express 
    app.set('secret','thisshouldnotbeinplaintext'); 
    app.use(bodyParser.urlencoded({ extended: false })); 
    app.use(bodyParser.json()); 
    app.use(passport.initialize()); 
    app.use(router); 


//config mosca 
var ascoltatore = { 
    //using ascoltatore 
    type: 'mongo', 
    url: 'mongodb://localhost:27017/mqtt', 
    pubsubCollection: 'ascoltatori', 
    mongo: {} 
}; 

var settings = { 
    port: 1883, 
    backend: ascoltatore, 
    persistence: { 
    factory: mosca.persistence.Mongo, 
    url: 'mongodb://localhost:27017/mqtt' 
    } 
}; 

var server = new mosca.Server(settings); 

server.on('clientConnected', function(client) { 
    console.log('client connected', client.id); 
}); 

// fired when a message is received 
server.on('published', function(packet, client) { 
    console.log('Published', packet.payload); 
}); 


server.on('ready', setup); 

// fired when the mqtt server is ready 
function setup() { 
    console.log('Mosca server is up and running'); 
} 

//Port Listening 
    app.listen(7000, function(){ 
    //Running 
    console.log("Node.js Server Is Running On localhost:7000"); 
    }); 

main.c를

#include <stdio.h> 

main() 
{ 
    char buf[1024]; 
    int i; 
    //mosquitto_sub -t 'test/topic' -v 
    //mosqui<to_pub -t 'test/topic' -m 'hello' 
    for(i=0; ;i++) { 
     //sprintf(buf, "mosquitto_pub -h 192.168.43.82 -p 1883 -t 'test' -m '%d'",i); 
     sprintf(buf, "mosquitto_pub -t 'test' -m '%d'",i); 
     printf("%s\n",buf); 
     system(buf); 
     sleep(1); 
    } 
} 
+1

여기에 무엇을 묻고 있는지 명확하지 않습니다. 시도해보고 다시 시도하여 달성하려는 내용을 명확하게 설명하십시오. – hardillb

답변

0

당신은 무엇을 의미하는 것은 Node.js를 서버에서 게시 데이터를 얻을 수 있다는 것입니다 당신의 원격 장치? 그 후, 서버는 MongoDB에 데이터를 저장합니까 ???

이 의미에서 서버는 클라이언트를 구독 할 필요가 없습니다. 아래 코드에서 데이터를 가져올 수 있습니다.

server.on('published', function(packet, client) { 
    console.log('Published : ', packet.topic + " --- " + packet.payload); 

    var MongoClient = require('mongodb').MongoClient; 
    var url = "mongodb://localhost:27017/mydb"; 

    MongoClient.connect(url, function(err, db) { 
     if (err) throw err; 

     var stringBuf = packet.payload.toString('utf-8'); 
     var myobj3 = JSON.parse(stringBuf); 

     db.collection("customers").insertOne(myobj3, function(err, res) { 
     if (err) throw err; 
     console.log("1 record inserted"); 
     db.close(); 
     }); 
    }); 
}); 
+0

이것은 매우 비효율적이며, 모든 메시지에 대해 데이터베이스에 대한 연결을 열고 닫는 것입니다. 또한 메시지 주제가 있는지 확인하지 않습니다. 옳은. – hardillb