Доступ к брокеру mqtt через node.js и сокет

Я новичок как в MQTT, так и в node.js, поэтому, пожалуйста, извините, если я не понимаю все термины правильно, или не понимаю, как все части сочетаются друг с другом

Я пытаюсь следовать примеру: http://blog.hekkers.net/2012/10/13/realtime-data-with-mqtt-node-js-mqtt-js-and-socket-io/

Я не могу понять это правильно, HTML-страница никогда не отображает значение / полезную нагрузку темы.

Насколько я понимаю, есть два файла: файл node.js и файл html. Для файла node.js я установил необходимые модули: socket.io и MQTTClient.js. Мой файл node.js - pusher.js:

var sys = require('sys');
var net = require('net');
var mqtt = require('./node_mqtt_client/MQTTClient.js');

var io  = require('socket.io').listen(5000);
var client = new mqtt.MQTTClient(1883, '192.168.1.108', 'pusher');

io.sockets.on('connection', function (socket) {
    socket.on('subscribe', function (data) {
    console.log('Subscribing to '+data.topic);
    client.subscribe(data.topic);
  });
});

client.addListener('mqttData', function(topic, payload){
  sys.puts(topic+'='+payload);
  io.sockets.emit('mqtt',{'topic':String(topic),'payload':String(payload)});
});

108 IP - это IP-адрес брокера RabbitMQ.

Кажется, нормально загружается, когда я получаю доступ к html-файлу, консоль выводит следующую информацию:

info  - socket.io started
Connected as :pusher
Session opend
   debug - client authorized
   info  - handshake authorized FAxJSO4DUEXV5wi50E-k
   debug - setting request GET /socket.io/1/websocket/FAxJSO4DUEXV5wi50E-k
   debug - set heartbeat interval for client FAxJSO4DUEXV5wi50E-k
   debug - client authorized for 
   debug - websocket writing 1::
Subscribing to aujen/weather/current/pressure
Subcribe to:aujen/weather/current/pressure
Connection closed by broker
   info  - transport end (undefined)
   debug - set close timeout for client FAxJSO4DUEXV5wi50E-k
   debug - cleared close timeout for client FAxJSO4DUEXV5wi50E-k
   debug - cleared heartbeat interval for client FAxJSO4DUEXV5wi50E-k
   debug - discarding transport
   debug - client authorized
   info  - handshake authorized AqzQ60WhMDA1_Ddv0E-l
   debug - setting request GET /socket.io/1/websocket/AqzQ60WhMDA1_Ddv0E-l
   debug - set heartbeat interval for client AqzQ60WhMDA1_Ddv0E-l
   debug - client authorized for 
   debug - websocket writing 1::
Subscribing to aujen/weather/current/pressure
MQTT connect to server time out
   debug - emitting heartbeat for client AqzQ60WhMDA1_Ddv0E-l
   debug - websocket writing 2::
   debug - set heartbeat timeout for client AqzQ60WhMDA1_Ddv0E-l
   debug - got heartbeat packet

Для части html я установил apache для размещения страницы - обычный apache без дополнительных модулей. Я также скачал необходимые библиотечные файлы и поместил их в ту же папку, что и мой HTML-файл: socket.io.min.js и jquery-1.4.2.js. Мои HTML-файлы выглядит следующим образом: index.html

<h1>Real Time</h1>
<script type="text/javascript" src="socket.io.min.js"></script>
<script type="text/javascript" src="jquery-1.4.2.js"></script>
<script type="text/javascript">
  var socket = io.connect('http://192.168.1.106:5000');
    socket.on('connect', function () {
      socket.on('mqtt', function (msg) {
        var elmarr=msg.topic.split("/");
        var elm=elmarr[3];
        console.log(msg.topic+' '+msg.payload);
        $('#'.concat(elm)).html(msg.payload);
     });
     socket.emit('subscribe',{topic:'aujen/weather/current/pressure'});
    });
</script>
<table class="tablegv" style="width: 500px;">
<tbody>
<tr class="tablegvHeader">
<td colspan="2"><center>Status</center></td>
</tr>
<tr>
<td>Return temp</td>
<td id="pressure"></td>
</tr>
</tbody>
</table>

106 IP - это IP-адрес моего сервера node.js.

HTML-страница не отображает значение / полезную нагрузку? темы, также как и pusher.js(не уверен, должен ли он)

Я знаю, что мой брокер (RabbitMQ) работает, так как я также практиковался в создании скрипта Python, который подписывается на темы и отображает значения / полезные нагрузки?.

python mqtt_sub.py 
rc: 0
Subscribed: 1 (0,)
aujen/weather/current/pressure 0 856.64
aujen/weather/current/temperature 0 25.63
aujen/weather/current/humidity 0 37

aujen/weather/current/pressure 0 856.67
aujen/weather/current/temperature 0 25.63
aujen/weather/current/humidity 0 36

aujen/weather/current/pressure 0 856.59
aujen/weather/current/temperature 0 25.62
aujen/weather/current/humidity 0 37

Кажется, я не могу найти много примеров попыток использовать этот метод для интеграции с брокером, большинство примеров вызывают клиента mosquitto_sub из файла js - не слишком увлечены этим.

Надеюсь, кто-то там может указать, что я сделал неправильно. Большое спасибо.

1 ответ

Я столкнулся с той же ошибкой, когда использовал плагин RabbitMQ + MQTT. После того, как я сменил брокера MQTT на комаров, все было в порядке.

Я попытался изменить MQTT-клиент на плагин mqtt для node.js (npm install mqtt) вместо node_mqtt_client / MQTTClient.js. Когда я использовал это, я мог использовать плагин RabbitMQ + MQTT без ошибок. Но мне нужно немного изменить pusher.js в этом случае.

var sys = require('sys');
var net = require('net');
var mqtt = require('mqtt');

var io  = require('socket.io').listen(5000);
var client = mqtt.createClient(1883, '127.0.0.1');

client.options.reconnectPeriod = 0;

client.on('message', function(topic, message) {
  console.log(message);
  sys.puts(topic+'='+message);
  io.sockets.in(topic).emit('mqtt',{'topic': String(topic), 'payload':String(message)});
});

io.sockets.on('connection', function (socket) {
  socket.on('subscribe', function (data) {
    console.log('Subscribing to '+data.topic);
    socket.join(data.topic);
    client.subscribe(data.topic);
  });
});
Другие вопросы по тегам