Javascript 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

与之类似,当从网络断开连接时,在NodeJS中是否可以获取计算机的MAC地址

我一直在使用该模块,当用户连接到网络时,该模块工作得很好,但如果用户断开连接,
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机器在脱机时只报告两个地址的MAC
00:00:00:00
(在“环回伪接口1”下)。因此,虽然这与联机时的地址相匹配,但它显然不是机器的唯一MAC地址,并且脱机时不会报告其他网络接口。在windows上,
os
模块的networkInterfaces方法在完全脱机时只返回环回接口。我猜macaddress模块依赖它,因此返回null。无论如何,在windows 10上,getmac模块返回我的mac fine。我将进一步测试它,但我怀疑我是否会记得回到这里。希望如此。我竖起了大拇指,但我建议在实际代码中不要将IP地址放在字符串常量中,甚至不要放在示例中。一些新手可能认为在实际操作中这样做是可以的。是的,在其他情况下,将其保留为32位数字进行逐位比较可能是有用的,但在这种特定情况下,检查是在来自os.networkInterfaces()的字符串之间进行的;