2015-06-18 152 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();的字符串之間。 –