commit c56d15852185bf356338703218c4335e39f5a4a3 Author: Joerg Date: Thu Mar 7 04:56:06 2024 +0100 1st version / Websockets via node.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8d98d99 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +config.js +yarn.lock diff --git a/config.js.sample b/config.js.sample new file mode 100644 index 0000000..c295091 --- /dev/null +++ b/config.js.sample @@ -0,0 +1,7 @@ +const config = { + mqttserver: { + host: "mqtt://[your mqtt-server hiere]" + } +}; + +module.exports = config; diff --git a/index.html b/index.html new file mode 100644 index 0000000..cc83cd0 --- /dev/null +++ b/index.html @@ -0,0 +1,44 @@ + + + + + + + + + + Topic:
+
+ + + diff --git a/mqtt.js b/mqtt.js new file mode 100755 index 0000000..32f1d8a --- /dev/null +++ b/mqtt.js @@ -0,0 +1,49 @@ +#!/usr/bin/env -S node +const config = require("./config.js"); // Configfile einbinden +var mqttserver=config.mqttserver.host; // mqtt-host aus json im configfile holen (ginge auch direkt) +var mqtt = require('mqtt'); // mqtt-module einbinden +var dateFormat = require('dateformat'); // date-format-module einbinden +var topica='#'; // variable in der das topic gehalten wird +const app = require('express')(); // http-express framework laden (macht routing, etc.) +const http = require('http').Server(app); // http-server module laden +const io = require('socket.io')(http); // socket.io einbinden +var client=new Array(); // Haelt die einzelnen mqtt-clients je (browser-)client + +app.get('/', (req, res) => { // Routing fuer index.html + res.sendFile(__dirname + '/index.html'); // index.html rauspusten +}); + +io.on('connection', (socket) => { // Neue socket.io Connection? + console.log(socket.id + " connected"); // Debug + client[socket.id] = mqtt.connect(mqttserver); // Dann neue MQTT-Verbindung aufmachen (je sock.io CLient eine, indiziert ueber die socket.id) + socket.on('wishtopic', (msg) => { // Von der Website kommt ein neuer Topic-Wunsch + client[socket.id].unsubscribe(topica); // Vom alten topic "unscubriben" + client[socket.id].subscribe(msg); // Neues Subscriben + topica=msg; // Neues merken + console.log('message: ' + msg); // Debug-Log + }); + socket.on("disconnect", (reason) => { // Socket.io Client gone? Dann mqtt fuer diesen Client wieder schliessen + client[socket.id].end(); + console.log(socket.id + " disconnected"); + }); + client[socket.id].on('message', function (topic, message) { // Handler, wenn mqtt-message kommt + date=new Date(); // Timestamp in date merken + msg={}; // msg-object initialisieren + if (message.toString().substring(0,1)=='{') { // JSON-String? Dann aufbereiten + try { + messagex=JSON.parse(message); // Versuchen mqtt-nachricht durch den jsonparser zu parsen + msg.content=messagex; // ergebnis in content haemmern + } catch(e) {} + } else { + msg.content=message.toString(); // Ist nix json? dann ab in "content" damit + } + msg.timestamp=dateFormat(date, "yyyy-mm-dd hh:MM:ss"); // timestamp formatieren + msg.topic=topic.toString(); // topic in das nachrichtenobject packen + socket.emit("mqtt",msg); // und raus an den Browser (nur fuer DIESES Socket, nicht fuer alle Clients) damit + }); + +}); + +http.listen(8000, () => { // Webserver starten + console.log(`Socket.IO server running at http://localhost:8000/`); // debug +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..1688220 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "dependencies": { + "dateformat": "", + "express": "", + "http": "", + "mqtt": "", + "socket.io": "" + }, + "name": "mqttstream", + "version": "1.0.0", + "description": "stream mqtt to browser", + "main": "mqtt.js", + "devDependencies": {}, + "scripts": { + "test": "mqtt.js #" + }, + "author": "int2k", + "license": "ISC" +}