sdl/sdl-mgr/app/modules/mqtt/index.js

94 lines
2.5 KiB
JavaScript

const module = 'mqtt'; // Module Name
import { load_config, log } from '../nwa-lib/index.js';
const config = load_config();
log(`Loaded module: ${module}`);
// log(`${module}: JSON.stringify(config.modules[module]): ${JSON.stringify(config.modules[module], null, 2)}`);
import aedes from 'aedes';
import net from 'net';
import http from 'http';
import websocketStream from 'websocket-stream';
const broker = aedes();
const port = {
"mqtt": config.modules[module].mqtt_port,
"ws": config.modules[module].ws_port
}
const bindAddrs =
Array.isArray(config.modules[module].bind_ip_addrs) &&
config.modules[module].bind_ip_addrs.length > 0
? config.modules[module].bind_ip_addrs
: ['0.0.0.0'];
if (!Number.isInteger(port.mqtt) || !Number.isInteger(port.ws)) {
throw new Error(`${module}: invalid port configuration`);
}
// ---- TCP MQTT (1883) ----
for (const addr of bindAddrs) {
const tcpServer = net.createServer(broker.handle);
tcpServer.listen(port.mqtt, addr, () => {
// log(`${module}: INFO: MQTT TCP broker listening on ${addr}:${port.mqtt}`, true);
});
}
// IP's for TCP MQTT
for (const addr of bindAddrs) {
if (addr === '0.0.0.0') {
for (const ip of config.host.ips) {
log(`${module}: INFO: MQTT TCP broker listening on ${ip}:${port.mqtt}`, true);
}
} else {
log(`${module}: INFO: MQTT TCP broker listening on ${addr}:${port.mqtt}`, true);
}
}
// ---- WebSocket MQTT (9001) ----
// ---- WebSocket MQTT (9001) ----
for (const addr of bindAddrs) {
const httpServer = http.createServer();
websocketStream.createServer(
{ server: httpServer },
broker.handle
);
httpServer.listen(port.ws, addr, () => {
if (addr === '0.0.0.0') {
for (const ip of config.host.ips) {
log(`${module}: INFO: MQTT WS broker listening on ${ip}:${port.ws}`, true);
}
} else {
log(`${module}: INFO: MQTT WS broker listening on ${addr}:${port.ws}`, true);
}
});
}
// ---- Logging (optional but useful) ----
broker.on('client', (client) => {
// console.log('Client connected:', client?.id);
log(`${module}: Client connected: ${client?.id}`);
});
broker.on('clientDisconnect', (client) => {
// console.log('Client disconnected:', client?.id);
log(`${module}: Client disconnected: ${client?.id}`);
});
broker.on('publish', (packet, client) => {
if (client) {
// console.log(
// `Publish from ${client.id}: ${packet.topic}`
// );
// log(`${module}: Publish from ${client.id}: ${packet.topic}`);
}
});