Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get mac address in Java using getHardwareAddress non-deterministic

I was having a problem to get the mac address of a machine, which was solved in this question using the follow code:

Process p = Runtime.getRuntime().exec("getmac /fo csv /nh"); 
java.io.BufferedReader in = new java.io.BufferedReader(new  java.io.InputStreamReader(p.getInputStream())); 
String line; 
line = in.readLine();         
String[] result = line.split(","); 

System.out.println(result[0].replace('"', ' ').trim()); 

However, I would like to know why this code is not working. Every time it reads the MAC address it returns a different value. First I thought it was because getHash, maybe using a timestamp I dont know... But even removing it the result changes.

Code

    public static byte[] getMacAddress() {
        try {
            Enumeration<NetworkInterface> nwInterface = NetworkInterface.getNetworkInterfaces();
            while (nwInterface.hasMoreElements()) {
                NetworkInterface nis = nwInterface.nextElement();
                if (nis != null) {
                    byte[] mac = nis.getHardwareAddress();
                    if (mac != null) {
                        /*
                         * Extract each array of mac address and generate a
                         * hashCode for it
                         */
                        return mac;//.hashCode();
                    } else {
                        Logger.getLogger(Utils.class.getName()).log(Level.WARNING, "Address doesn't exist or is not accessible");
                    }
                } else {
                    Logger.getLogger(Utils.class.getName()).log(Level.WARNING, "Network Interface for the specified address is not found.");
                }
                return null;
            }
        } catch (SocketException ex) {
            Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
}

Output example (i'm printing directly from byte array, but its enough to see that different i think)

[B@91cee
[B@95c083
[B@99681b
[B@a61164
[B@af8358
[B@b61fd1
[B@bb7465
[B@bfc8e0
[B@c2ff5
[B@c8f6f8
[B@d251a3
[B@d6c16c
[B@e2dae9
[B@ef5502
[B@f7f540
[B@f99ff5
[B@fec107

Thanks in advance

like image 879
Pedro Dusso Avatar asked Jun 09 '12 15:06

Pedro Dusso


People also ask

What is MAC address in Java?

A MAC address is the unique identifier for a physical network interface card. We'll cover MAC addresses only, but for a more general overview of network interfaces, refer to Working with Network Interfaces in Java. 2. Examples

What is the MAC address of the network interface?

A MAC (Media Access Control) address is a unique identifier assigned to network interfaces for communication on the physical network. The network.getHardwareAddress () method gives the hardware (usually MAC) address of the network interface. sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ?

How do I get the hardware address of a network interface?

The network.getHardwareAddress () method gives the hardware (usually MAC) address of the network interface. sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ?

What is MacMac address of device?

MAC address of a device is a unique identifier assigned to a network interface controller (NIC). For communications within a network segment, it is used as a network address for most IEEE 802 network technologies, including Ethernet, Wi-Fi, and Bluetooth.


4 Answers

B@91cee actually is the result toString() method of the byte[] arrays.

I would suggest you print the value using new String(mac) instead.

byte[].toString() is implemented as:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

Since default Object.hashCode() is implemented as address in memory, thus it is not consistent as you are creating new Object each time.

Edit:

Since the returned byte is in hex, so you should convert it into decimal String. The code can see from here

like image 180
Pau Kiat Wee Avatar answered Oct 18 '22 02:10

Pau Kiat Wee


Here is an example from Mkyong.com web site on how to get the MAC address in Java:

package com.mkyong;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;

public class app{

   public static void main(String[] args){

    InetAddress ip;
    try {

        ip = InetAddress.getLocalHost();
        System.out.println("Current IP address : " + ip.getHostAddress());

        NetworkInterface network = NetworkInterface.getByInetAddress(ip);

        byte[] mac = network.getHardwareAddress();

        System.out.print("Current MAC address : ");

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < mac.length; i++) {
            sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));        
        }
        System.out.println(sb.toString());

    } catch (UnknownHostException e) {

        e.printStackTrace();

    } catch (SocketException e){

        e.printStackTrace();

    }

   }

}
like image 42
Eduardo Sanchez-Ros Avatar answered Oct 18 '22 00:10

Eduardo Sanchez-Ros


The answer from spaniard doesn't work if the machine is not connected and it will give different values depend on network you are connected to.

this one is not depending on any ip adress :

public class MacAdress {
    public static void main(String[] args) {
        try {
            InetAddress ip = InetAddress.getLocalHost();
            System.out.println("Current IP address : " + ip.getHostAddress());

            Enumeration<NetworkInterface> networks =
                             NetworkInterface.getNetworkInterfaces();
            while(networks.hasMoreElements()) {
                NetworkInterface network = networks.nextElement();
                byte[] mac = network.getHardwareAddress();

                if (mac != null) {
                    System.out.print("Current MAC address : ");

                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < mac.length; i++) {
                        sb.append(String.format("%02X%s", mac[i],
                                     (i < mac.length - 1) ? "-" : ""));
                    }
                }
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (SocketException e){
            e.printStackTrace();
        }
    }
}
like image 4
amghar Avatar answered Oct 18 '22 01:10

amghar


public static String getHardwareAddress() throws Exception {
    InetAddress ip = InetAddress.getLocalHost();
    NetworkInterface ni = NetworkInterface.getByInetAddress(ip);
    if (!ni.isVirtual() && !ni.isLoopback() && !ni.isPointToPoint() && ni.isUp()) {
        final byte[] bb = ni.getHardwareAddress();
        return IntStream.generate(ByteBuffer.wrap(bb)::get).limit(bb.length)
                .mapToObj(b -> String.format("%02X", (byte)b))
                .collect(Collectors.joining("-"));
    }
    return null;
}
like image 2
s13o Avatar answered Oct 18 '22 02:10

s13o