2017-07-26 47 views
1

我有兩個程序,一個發件人和一個收件人。發送者在IOT Hub上發送一些消息給設備,接收者只要發送者發送它們就會接收這些消息。我使用socket.io將這些消息廣播到連接的客戶端。但是,當發送者停止時,接收者也會停下來,但發送者發送的最後一條消息會無限播放,直到我關閉接收者或發送者再次啓動併發送新消息。最後一條消息將被複制並無限播放。如何檢查發件人程序是否已停止?如何檢查Azure IOT Hub發件人是否已停止使用node.js和socket.io

這是發件人prrogram:

var clientFromConnectionString = require('azure-iot-device-mqtt').clientFromConnectionString; 
var Message = require('azure-iot-device').Message; 
var connectionString = 'conn_string' 
var client = clientFromConnectionString(connectionString); 

var avgTemperature = 20; 

var printResult = function (err, res) { 
    if (err) { 
     console.log('send error: ' + err.toString()); 
     return; 
    } 
    console.log('send status: ' + res.constructor.name); 
}; 

setInterval(function() { 
    var currentTemperature = avgTemperature + (Math.random() * 10) - 2; 
    var data = JSON.stringify({ 
     deviceId: 'test', 
     temperature: currentTemperature, 
     latitude: 50.286264, 
     longitude: 19.104079, 
     time: Date.now() 
    }); 
    var message = new Message(data); 
    console.log("Sending message: " + message.getData()); 
    client.sendEvent(message, printResult); 
}, 5000); 

這是接收並播放給客戶端的socket.io:

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 
var EventHubClient = require('azure-event-hubs').Client; 
var connectionString = 'conn_string' 

var printError = function (err) { 
    console.log(err.message); 
}; 

var result; 

var printMessage = function (message) { 
    console.log('Message received: '); 
    result = JSON.stringify(message.body); 
    console.log('message: ' + result); 
    /* io.on('connection', function(socket){ 


    socket.on('chat message', function(msg){ 

    io.emit('chat message', result); 
    }); 
}); */ 

     console.log(''); 
}; 

count =0; 

app.get('/', function(req, res){ 
    res.sendFile(__dirname + '/index.html'); 
}); 

io.on('connection', function(socket){ 
    console.log('user connected'); 
    socket.on('chat message', function(msg){ 

    io.emit('chat message', result); 

    }); 
    socket.on('disconnect', function(){ 
    console.log('user disconnected'); 
     socket.removeAllListeners('disconnect'); 
     io.removeAllListeners('connection'); 
    }); 
}); 

var client = EventHubClient.fromConnectionString(connectionString); 
client.open() 
    .then(client.getPartitionIds.bind(client)) 
    .then(function (partitionIds) { 
     return partitionIds.map(function (partitionId) { 
      return client.createReceiver('$Default', partitionId, { 'startAfterTime' : Date.now()}).then(function(receiver) { 
       console.log('Created partition receiver: ' + partitionId) 
       receiver.on('errorReceived', printError); 
       receiver.on('message', printMessage); 
      }); 
     }); 
    }) 
    .catch(printError); 


http.listen(3000, function(){ 
    console.log('listening on *:3000'); 
}); 
+0

你可以使用'message.sequenceNumber'來檢查它是一個新的消息還是舊的消息,以防止廣播重複。 –

+0

序列號不是消息的函數。在發件人和收件人都試過它,當我打印它時,即時通知未定義。 – Neo

+0

它不是一個函數,而是一個屬性,像這樣訪問它:'message.sequenceNumber'就像你訪問'message.body'一樣。它的定義是[here](https://github.com/Azure/azure-event-hubs-node/blob/master/send_receive/lib/eventdata.js)。 –

回答

1

根據你的代碼。每當發送者停止發送時,接收者將不會收到消息,並會等待發送者發送新消息。但是,如果您仍想檢查,則可以使用帶有發件人郵件的序列號或與其關聯的ID來檢查重複郵件。