Files
spore-ledlab/server/udp-discovery.js
2025-10-27 09:37:20 +01:00

87 lines
1.8 KiB
JavaScript

// UDP Sender service for sending frames to SPORE nodes
const dgram = require('dgram');
class UdpSender {
constructor(port = 4210) {
this.port = port;
this.socket = null;
this.isRunning = false;
}
start() {
if (this.isRunning) {
return;
}
this.socket = dgram.createSocket('udp4');
this.isRunning = true;
this.socket.on('error', (err) => {
console.error('UDP Sender socket error:', err);
});
this.socket.bind(0, () => {
// Bind to any available port
this.socket.setBroadcast(true);
console.log(`UDP Sender ready on port ${this.socket.address().port}`);
});
}
stop() {
if (!this.isRunning) {
return;
}
this.isRunning = false;
if (this.socket) {
this.socket.close();
this.socket = null;
}
console.log('UDP Sender stopped');
}
sendToNode(nodeIp, message) {
if (!this.socket) {
return false;
}
const buffer = Buffer.from(message, 'utf8');
return new Promise((resolve, reject) => {
this.socket.send(buffer, 0, buffer.length, this.port, nodeIp, (err) => {
if (err) {
console.error(`Error sending to node ${nodeIp}:`, err);
reject(err);
return;
}
resolve(true);
});
});
}
broadcastToAll(message) {
if (!this.socket) {
return false;
}
const buffer = Buffer.from(message, 'utf8');
this.socket.setBroadcast(true);
return new Promise((resolve, reject) => {
this.socket.send(buffer, 0, buffer.length, this.port, '255.255.255.255', (err) => {
if (err) {
console.error('Error broadcasting message:', err);
reject(err);
return;
}
resolve(true);
});
});
}
}
module.exports = UdpSender;