const mqtt = require('mqtt'); const express = require('express'); const WebSocket = require('ws'); const fs = require('fs'); const path = require('path'); const app = express(); const port = 3001; const brokerUrl = 'mqtt://localhost'; // Replace with your broker's URL const client = mqtt.connect(brokerUrl); const mainTopic = 'apu_tb'; let nodeData = Array.from({ length: 5 }, () => Array(5).fill(null)); const nodeLastActive = {}; // Track the last active timestamp for each node app.post('public/index.html') // Serve static files from the template's public folder app.use(express.static(path.join(__dirname, 'public'))); // app.use(express.static(__dirname)); // Route to serve the main dashboard HTML file app.get('/', (req, res) => { res.sendFile(path.join(__dirname, 'public/index.html')); }); // Example API endpoint for dashboard data app.get('/api/data', (req, res) => { res.json({ users: 150, sales: 2500, revenue: 50000, active_sessions: 45 }); }); const server = require('http').createServer(app); const ws = new WebSocket.Server({ server }); // Start the server server.listen(port, () => { console.log(`Server running at http://localhost:${port}`); }); function broadcastNodeData() { const data = { nodeData, nodeStatus: Object.keys(nodeLastActive).reduce((acc, key) => { const [y, x] = key.split(',').map(Number); const isActive = Date.now() - nodeLastActive[key] <= 10000; acc[y] = acc[y] || []; acc[y][x] = isActive ? 'lightgreen' : 'lightcoral'; return acc; }, []), }; // console.log('Broadcasting data:', JSON.stringify(data)); // Log the broadcasted data ws.clients.forEach(client => { if (client.readyState === WebSocket.OPEN) { client.send(JSON.stringify(data)); } }); } client.on('connect', () => { console.log('Connected to MQTT broker'); client.subscribe(`${mainTopic}/#`, (err) => { if (!err) { console.log(`Subscribed to all subtopics of: ${mainTopic}`); } else { console.error('Subscription error:', err); } }); }); client.on('message', (topic, message) => { try { const payload = JSON.parse(message.toString()); if (Array.isArray(payload) && payload.length === 2) { const data = payload[0]; const metadata = payload[1]; const { uptime, cpu_temp, mem_util, cpu_util, XPosition, YPosition } = data; const { id } = metadata; if (XPosition >= 0 && XPosition < 5 && YPosition >= 0 && YPosition < 5) { nodeData[YPosition][XPosition] = `ID: ${id}
Temp: ${cpu_temp}°C
CUtil: ${cpu_util}
MUtil: ${mem_util}
UpTime: ${uptime}`; // Update the last active timestamp for the node nodeLastActive[`${YPosition},${XPosition}`] = Date.now(); // console.log(`Node data updated for ID ${id} at position (${XPosition}, ${YPosition})`); // Broadcast updated data and statuses // broadcastNodeData(); // console.log("Checkboxes known:", checkedNodeInfo); // Use this array in your app } } else { console.error('Unexpected payload format:', payload); } } catch (err) { console.error('Failed to process message:', err); } }); // Periodically broadcast the node status setInterval(() => { broadcastNodeData(); }, 1000);