Nodejs脚本系列——UDP设备发现程序

最近一直在玩树莓派,由于树莓派大多数时候都是使用ssh远程连接上去操作的,需要将pi连到局域网中,但是大多数路由器都是DHCP自动配置IP地址,所以每次都要蛋疼的找pi的地址。

于是本着偷懒的原则,我写了这个脚本。

脚本很简单,就是使用UDP广播。分为服务端(被寻找)和客户端(寻找),服务端设置一个UDP监听,监听端口收到的特定标识字符串,然后向发送者发出响应,发送者收到该响应就能知道服务端的地址了。

服务端主要代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//监听端口收到的数据
server.on("message", function (msg, rinfo) {
console.log("got broadcast: " + msg + " from " +
rinfo.address + ":" + rinfo.port);
if(msg.toString() === config.idString) {
var str = config.responseString;
if (config.additionalString) {
str = str + ':' + config.additionalString;
}
var message = Buffer.from(str);
server.send(message, 0, message.length, config.clientPort, rinfo.address, function (err, bytes) {
if (err) {
console.log('reply mess err:' + err);
}
});
}
});
server.on("listening", function () {
var address = server.address();
console.log("server listening broadcast on " +
address.address + ":" + address.port);
});

//UDP开始监听端口
server.bind(config.serverPort);

客户端主要代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//接收到服务端返回信息
udp.on("message", function (msg, rinfo) {
var msgArray = msg.toString().split(':');
var msgTitle = msgArray[0];
var msgContent = msgArray[1];
if(msgTitle === config.responseString){
if (!found) {
console.log('****** found target ******');
}
console.log(' ' + rinfo.address + (msgContent ? ': ' + msgContent : ''));
found = true;
}
});

//绑定接收服务端回复信息的本地端口
udp.bind(config.clientPort, function () {
udp.setBroadcast(true);
});

var broadcastAddr = '255.255.255.255';
if(config.broadcastAddr){
broadcastAddr = config.broadcastAddr;
}

console.log('broadcast on:' + broadcastAddr + ' ...\n');
var message = Buffer.from(config.idString);

//向局域网发送一条广播
udp.send(message, 0, message.length, config.serverPort, broadcastAddr, function(err, bytes) {
if(err){
console.log('broadcast mess err:' + err);
process.exit();
}
});

服务端运行效果:

客户端运行效果:

服务端(树莓派上)运行Nodejs脚本可以使用pm2以守护进程方式运行在后台,并设置开机启动。

完整代码可以在Github上下载。

EOF