Доступ к брокеру 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);
});
});