2015-06-18 153 views
2

this question in C#类似,NodeJS可能在从网络断开连接时获取计算机的MAC地址吗?NodeJS - 脱机时获取MAC地址

我一直在使用macaddress模块,该模块在用户连接到网络时效果很好 - 但如果用户断开连接,macaddress将不会在某些系统上返回任何地址。

我注意到os.networkInterfaces()当用户离线/在线,以及跨Windows/Mac和Node v10/v12的行为差异之间的一些差异。我不确定问题实际上在哪里。

回答

3

我刚刚使用getmac模块进行了测试,并且可以在离线(和在线)下正常工作。

,您可以尝试这样的:

require('getmac').getMac(function(err,macAddress){ 
    if (err) throw err 
    console.log(macAddress) // 77:31:c2:c5:03:10 
}) 

如果你不想使用一个模块,您还可以要求每个MAC地址的接口是这样的(节点> = 0.11):

require('os').networkInterfaces() 

然后根据您的需要解析它。

结果应该是这样的:

{ 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 } ] } 
+0

我也尝试过使用'getmac',但它在Windows上抛出错误 - 所以这并没有给我太多信心。 – arthurakay

+1

如何使用'require('os')。networkInterfaces()'? – Gepser

+0

我的windows机器在离线时(仅在“Loopback Pseudo-Interface 1”下)报告MAC'00:00:00:00:00:00'。因此,当在线时匹配这些地址时,显然不是该机器的唯一MAC地址 - 并且在脱机时不报告其他网络接口。 – arthurakay

1

目前面临着同样的情况。基于知道我们已知的接口的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); 

您可以修改根据一些你已经知道,以配合您的需要。

实际上没有回答与离线的问题,但您可以检查!!data的状态。

+1

我竖起大拇指,但我建议不要在实际代码中将IP地址放在字符串常量中,甚至不是一个例子。有些新手可能会认为在实际操作中可以这么做。 – FauChristian

+0

是的,在其他上下文中,将其保留为按位比较的32位数字可能是有用的,但在此特定情况下,检查位于来自os.networkInterfaces();的字符串之间。 –