2015-06-18 2 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

Мои окна обрабатывают MAC '00: 00: 00: 00: 00: 00' только для двух адресов в автономном режиме (в разделе« Псевдо-интерфейс Loopback 1 »). Таким образом, хотя это соответствует этим адресам, когда он находится в сети, это явно не единственный 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(); –

Смежные вопросы