87 lines
1.8 KiB
JavaScript
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;
|