94 lines
2.5 KiB
JavaScript
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}`);
|
|
}
|
|
});
|