// 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;