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
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
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) ?
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) ?
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.
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
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();
}
}
}
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();
}
}
}
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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With