Javascript NodeJS-脱机时获取MAC地址
与之类似,当从网络断开连接时,在NodeJS中是否可以获取计算机的MAC地址 我一直在使用该模块,当用户连接到网络时,该模块工作得很好,但如果用户断开连接,Javascript NodeJS-脱机时获取MAC地址,javascript,node.js,mac-address,Javascript,Node.js,Mac Address,与之类似,当从网络断开连接时,在NodeJS中是否可以获取计算机的MAC地址 我一直在使用该模块,当用户连接到网络时,该模块工作得很好,但如果用户断开连接,macaddress将不会返回某些系统上的任何地址 我注意到当用户离线/在线时,os.networkInterfaces()之间存在一些差异,以及Windows/Mac和节点v10/v12之间的行为差异。我不确定问题到底出在哪里。我刚刚用模块进行了测试,离线(和在线)都可以正常工作 您可以这样尝试: require('getmac').get
macaddress
将不会返回某些系统上的任何地址
我注意到当用户离线/在线时,os.networkInterfaces()
之间存在一些差异,以及Windows/Mac和节点v10/v12之间的行为差异。我不确定问题到底出在哪里。我刚刚用模块进行了测试,离线(和在线)都可以正常工作
您可以这样尝试:
require('getmac').getMac(function(err,macAddress){
if (err) throw err
console.log(macAddress) // 77:31:c2:c5:03:10
})
{ lo0:
[ { address: '::1',
netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
family: 'IPv6',
mac: '00:00:00:00:00:00',
scopeid: 0,
internal: true },
{ address: '127.0.0.1',
netmask: '255.0.0.0',
family: 'IPv4',
mac: '00:00:00:00:00:00',
internal: true },
{ address: 'fe80::1',
netmask: 'ffff:ffff:ffff:ffff::',
family: 'IPv6',
mac: '00:00:00:00:00:00',
scopeid: 1,
internal: true } ],
en0:
[ { address: '10.3.162.15',
netmask: '255.255.254.0',
family: 'IPv4',
mac: '77:31:c2:c5:03:10',
internal: false } ],
vboxnet0:
[ { address: '192.168.33.1',
netmask: '255.255.255.0',
family: 'IPv4',
mac: '0a:00:27:00:00:00',
internal: false } ],
en3:
[ { address: '10.3.32.45',
netmask: '255.255.248.0',
family: 'IPv4',
mac: '0c:4d:e7:3d:3d:17',
internal: false } ] }
如果您不想使用模块,也可以像这样要求每个mac地址接口(节点>=0.11):
然后根据需要对其进行解析
结果应该如下所示:
require('getmac').getMac(function(err,macAddress){
if (err) throw err
console.log(macAddress) // 77:31:c2:c5:03:10
})
{ lo0:
[ { address: '::1',
netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
family: 'IPv6',
mac: '00:00:00:00:00:00',
scopeid: 0,
internal: true },
{ address: '127.0.0.1',
netmask: '255.0.0.0',
family: 'IPv4',
mac: '00:00:00:00:00:00',
internal: true },
{ address: 'fe80::1',
netmask: 'ffff:ffff:ffff:ffff::',
family: 'IPv6',
mac: '00:00:00:00:00:00',
scopeid: 1,
internal: true } ],
en0:
[ { address: '10.3.162.15',
netmask: '255.255.254.0',
family: 'IPv4',
mac: '77:31:c2:c5:03:10',
internal: false } ],
vboxnet0:
[ { address: '192.168.33.1',
netmask: '255.255.255.0',
family: 'IPv4',
mac: '0a:00:27:00:00:00',
internal: false } ],
en3:
[ { address: '10.3.32.45',
netmask: '255.255.248.0',
family: 'IPv4',
mac: '0c:4d:e7:3d:3d:17',
internal: false } ] }
目前面临同样的情况。基于已知接口的IP地址,我最终得到了以下代码
var os = require('os');
var getNetworkDataForThisIP = function(ipOfTheInterfaceWanted) {
var networkInterfaces = os.networkInterfaces();
var selectedInterfaceData;
Object.keys(networkInterfaces).forEach((NetworkID, index, obj) => {
networkInterfaces[NetworkID].forEach((data) => {
if (data.family == "IPv4" && ipOfTheInterfaceWanted== data.address) {
//I created new Object because the NetworkID is not provided in the 'data' object
selectedInterfaceData = {
network: NetworkID,
address: data.address,
netmask: data.netmask,
family: data.family,
mac: data.mac,
};
}
});
});
return selectedInterfaceData;
}
var data = getNetworkDataForThisIP("192.168.5.1")
console.log(data.network);
console.log(data.address);
console.log(data.netmask);
console.log(data.family);
console.log(data.mac);
您可以根据您已经知道的内容进行修改以满足您的需要
离线时实际上没有回答问题,但您可以检查
的状态!!数据
我也尝试过使用getmac
,但是它在Windows上抛出了错误-所以这没有给我太多信心。使用require('os').networkInterfaces()
?我的Windows机器在脱机时只报告两个地址的MAC00:00:00:00
(在“环回伪接口1”下)。因此,虽然这与联机时的地址相匹配,但它显然不是机器的唯一MAC地址,并且脱机时不会报告其他网络接口。在windows上,os
模块的networkInterfaces方法在完全脱机时只返回环回接口。我猜macaddress模块依赖它,因此返回null。无论如何,在windows 10上,getmac模块返回我的mac fine。我将进一步测试它,但我怀疑我是否会记得回到这里。希望如此。我竖起了大拇指,但我建议在实际代码中不要将IP地址放在字符串常量中,甚至不要放在示例中。一些新手可能认为在实际操作中这样做是可以的。是的,在其他情况下,将其保留为32位数字进行逐位比较可能是有用的,但在这种特定情况下,检查是在来自os.networkInterfaces()的字符串之间进行的;