wlan mac地址 network interface IPv6 IPv4

网络接口获取:

Enumeration<NetworkInterface> interfaces =  NetworkInterface.getNetworkInterfaces();
                while(interfaces.hasMoreElements()){
                    String name = interfaces.nextElement().getName();
                    NetworkInterface inter = null;
                    StringBuffer buffer = new StringBuffer();
                    if (name != null) {
                        Log.e(TAG, "interface:  " + name);
                        inter = NetworkInterface.getByName(name);
                    }
                    if(inter != null){
                        byte[] addr = inter.getHardwareAddress();
                        if(addr != null){
                            for (byte b : addr) {
                                buffer.append(String.format("%02X:", b));
                            }
                            if (buffer.length() > 0) {
                                buffer.deleteCharAt(buffer.length() - 1);
                            }
                            Log.e(TAG, name + ":  " +buffer.toString());
                        }

                    }

                }

可能会打出如下log:

interface: eth0
eth0: 2E:54:E7:A7:D5:83
interface: sit0
interface: lo
interface: wlan0
wlan0: B0:F1:EC:0B:85:26

就是有名字为eth0,sit0,lo,wlan0四个接口。其中只有两个接口有mac地址。

getHardwareAddress():

/**
     * Returns the hardware address of the interface, if it has one, or null otherwise.
     *
     * @throws SocketException if an I/O error occurs.
     * @since 1.6
     */
    public byte[] getHardwareAddress() throws SocketException {
        try {
            // Parse colon-separated bytes with a trailing newline: "aa:bb:cc:dd:ee:ff\n".
            String s = IoUtils.readFileAsString("/sys/class/net/" + name + "/address");
            byte[] result = new byte[s.length()/3];
            for (int i = 0; i < result.length; ++i) {
                result[i] = (byte) Integer.parseInt(s.substring(3*i, 3*i + 2), 16);
            }
            // We only want to return non-zero hardware addresses.
            for (int i = 0; i < result.length; ++i) {
                if (result[i] != 0) {
                    return result;
                }
            }
            return null;
        } catch (Exception ex) {
            throw rethrowAsSocketException(ex);
        }
    }
看代码是读取"/sys/class/net/" + name + "/address"

网络接口(NetworkInterface)除了mac地址外,还有一个重要属性,就是IP,这个要联网了才有的。使用如下方法读取IPv6

private static String[] readIfInet6Lines() throws SocketException {
        try {
            return IoUtils.readFileAsString("/proc/net/if_inet6").split("\n");
        } catch (IOException ioe) {
            throw rethrowAsSocketException(ioe);
        }
    }

就是去"/proc/net/if_inet6"读取,内容如下:

00000000000000000000000000000001 01 80 10 80       lo

fe80000000000000020822fffe6ce3fb 07 40 20 80    wlan0


而读取IPv4时使用NetworkInterface#collectIpv4Address()

读取IPv6石使用NetworkInterface#collectIpv6Addresses(),该方法调用了NetworkInterface#readIfInet6Lines()

使用工具写Mac地址和写wlan 地址(或者说wifi 地址)是不是一样,工具写Mac地址指的是写以太网接口的地址,而不是无线局域网接口的mac地址。一般名字以eth开头的就是以太网接口(Ethernet),无线局域网接口名称一般使用wlan开头。

接口名称可以使用以下属性定义:

wifi.interface=wlan0


写完wifi 地址后,一般需要重启或者恢复出厂设置才可以生效,就是说并不是一开始就写到"/sys/class/net/" + name + "/address"中,而是在开机或者在recovery模式启动时才由某个位置复制到"/sys/class/net/" + name + "/address"。有些时候工具写完后,能读出来,但是使用代码读取不了,是因为"/sys/class/net/" + name + "/address"根本没有,就是说在开机启动时复制到"/sys/class/net/" + name + "/address的过程中出错了。


因为移动设备有各种id,比较容易混,下面再说一下SN号和IMEI号:

SN码是Serial Number的缩写,有时也叫SerialNo,也就是产品序列号,产品序列是为了验证“产品的合法身份”而引入的一个概念,它是用来保障用户的正版权益,享受合法服务的;一套正版的产品只对应一组产品序列号。

IMEI为TAC + FAC + SNR + SP。IMEI(International Mobile Equipment Identity)是国际移动设备身份码的缩写,国际移动装备辨识码,是由15位数字组成的"电子串号",它与每台手机一一对应,而且该码是全世界唯一的。每一只手机在组装完成后都将被赋予一个全球唯一的一组号码,这个号码从生产到交付使用都将被制造生产的厂商所记录


猜你喜欢

转载自blog.csdn.net/b1480521874/article/details/79938045
今日推荐