IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Studio的代码笔记--SN序列号、MAC地址、IP地址学习 -> 正文阅读

[移动开发]Android Studio的代码笔记--SN序列号、MAC地址、IP地址学习

SN序列号

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

获取SN序列号

    /**
     * @LXH 获取设备的SN序列号 
     * @return SN序列号
     */
    public String get_SN() {
        String serial_n = "";
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {//9.0+
                serial_n = Build.getSerial();
            } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {//8.0+
                serial_n = Build.SERIAL;//android.os.Build.SERIAL
            } else {//8.0-
                Class<?> c = Class.forName("android.os.SystemProperties");
                Method get = c.getMethod("get", String.class);
                serial_n = (String) get.invoke(c, "ro.serialno");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("LXH", "读取设备序列号异常:" + e.toString());
        }
        Log.i("LXH","设备的SN序列号:"+serial_n);
        return serial_n;
    }

适用各个版本,有提示添加权限如下,但是我没加这个权限时也可以运行成功

    <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>

MAC地址

MAC地址(英语:Media Access Control Address),直译为媒体存取控制位址,也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责MAC位址 [1] 。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。
MAC地址是一个用来确认网络设备位置的位址。在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责MAC位址 。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。

获取MAC地址

    /**
     * @LXH 获取设备的MAC地址 
     * MAC地址=局域网地址=MAC位址=以太网地址=或物理地址
     * @return MAC地址
     */
    public String get_MAC() {
        String ethernet_mac = null;
        BufferedReader bufferedReader_mac = null;
        FileReader fileReader_mac = null;
        try {
            fileReader_mac = new FileReader("sys/class/net/eth0/address");
            bufferedReader_mac = new BufferedReader(fileReader_mac);
            ethernet_mac = bufferedReader_mac.readLine();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader_mac != null)
                    bufferedReader_mac.close();
                if (fileReader_mac != null)
                    fileReader_mac.close();
            } catch (IOException e) {
                e.printStackTrace();
                Log.e("LXH", "读取设备MAC地址异常:" + e.toString());
            }
        }
        Log.i("LXH","设备的MAC地址:"+ethernet_mac);
        return ethernet_mac;
    }

获取的MAC地址就是有线网络的地址,即物理地址

IP、wlanIP、wlanMAC、网络、ping

因为要访问网络,所以要添加网络权限,没有添加权限会得到null

    <uses-permission android:name="android.permission.INTERNET"/>

获取以太网的IP地址

    /**
     * @LXH 获取设备以太网的IP地址 
     * @return 以太网的IP地址
     */
    public String get_ethernet_IP() {
        String ethernet_IP = null;
        try {
            Enumeration nis = NetworkInterface.getNetworkInterfaces();
            while (nis.hasMoreElements()) {
                NetworkInterface ni = (NetworkInterface) nis.nextElement();
                Enumeration<InetAddress> ias = ni.getInetAddresses();
                while (ias.hasMoreElements()) {
                    InetAddress ia = ias.nextElement();
                    if (ia instanceof Inet6Address) {
                        continue;
                    }
                    String hostAddress = ia.getHostAddress();
                    if (!"127.0.0.1".equals(hostAddress)) {
                        ethernet_IP = hostAddress;
                        break;
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        Log.i("LXH","设备以太网的IP地址:"+ethernet_IP);
        return ethernet_IP;
    }

获取设备wlan的IP地址

/**
     * @LXH 获取设备wlan的IP地址
     * @return wlan的IP地址
     */
    public String get_wlan_IP() {
        String wlan_IP="";
        List<NetworkInterface> interfaces = null;
        try {
            interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface networkInterface : interfaces) {
                if (networkInterface != null && TextUtils.isEmpty(networkInterface.getName()) == false) {
                    if ("wlan0".equalsIgnoreCase(networkInterface.getName())) {
                        Enumeration<InetAddress> enumIpAddr = networkInterface.getInetAddresses();
                        while (enumIpAddr.hasMoreElements()) {
                            InetAddress inetAddress = enumIpAddr.nextElement();
                            if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
                                wlan_IP=inetAddress.getHostAddress();
                                Log.i("LXH","设备wlan的IP地址:"+wlan_IP);
                                return wlan_IP;
                            }
                        }
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return wlan_IP;
    }

获取wlan的MAC地址

    /**
     * @LXH 获取wlan的MAC地址
     * @return wlan0的mac地址
     */
    public String get_wlan_MAC() {
        String wlan_MAC="";
        List<NetworkInterface> interfaces = null;
        try {
            interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface networkInterface : interfaces) {
                if (networkInterface != null && TextUtils.isEmpty(networkInterface.getName()) == false) {
                    if ("wlan0".equalsIgnoreCase(networkInterface.getName())) {
                        byte[] macBytes = networkInterface.getHardwareAddress();
                        if (macBytes != null && macBytes.length > 0) {
                            StringBuilder str = new StringBuilder();
                            for (byte b : macBytes) {
                                str.append(String.format("%02X:", b));
                            }
                            if (str.length() > 0) {
                                str.deleteCharAt(str.length() - 1);
                            }
                            wlan_MAC=str.toString();
                            Log.i("LXH","设备wlan的MAC地址:"+wlan_MAC);
                            return wlan_MAC;
                        }
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return wlan_MAC;
    }

wlan的mac地址需要添加如下权限,否则会报错。

     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>

判断当前网络是否可以用

    /**
     * @LXH 判断当前网络是否可以用
     * @return boolean
     */
    public boolean is_Network() {
        boolean is_network = false;
        ConnectivityManager manager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (manager == null) {
            return false;
        }
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        is_network= networkInfo != null && networkInfo.isConnected();
        Log.i("LXH","当前网络是否可以用:"+is_network);
        return is_network;
    }

网络可用不代表能上网,但是可以与同网段的通信

判断ping一个xx地址是否能ping通

    /**
     * @LXH 判断ping一个xx地址是否能ping通
     * @param ip
     * @return boolean
     */
    public boolean is_PingIP(String ip) {
        boolean pingIP = false;
        try {//-c 1是指ping的次数为1次,-w 3是指超时时间为3s
            Process process = Runtime.getRuntime().exec("ping -c 1 -w 3 " + ip);
            int status = process.waitFor();
            if (status == 0) {//status为0表示ping成功
                pingIP=true;
                Log.i("LXH","ping "+ip+" 是否成功:"+pingIP);
                return pingIP;
            }
        }catch (InterruptedException | IOException e) {
            e.printStackTrace();
        }
        Log.i("LXH","ping "+ip+" 是否成功:"+pingIP);
        return pingIP;
    }

运行日志
在这里插入图片描述

命令 busybox ifconfig 和 命令 netcfg

在终端下输入adb shell进入android的终端

 busybox ifconfig

显示或配置网络设备(网络接口卡)的命令,在android中的ifconfig
在这里插入图片描述只截取了有线网口的信息,实际会显示所有的网络接口信息,可以根据信息对比判断试是否得到正确的信息

netcfg

在这里插入图片描述第一项为网卡接口类型,第二项为打开关闭状态,第三项为分配的ip地址,第四项为接口标志,第五项为硬件地址。netcfg的源码在系统下位置为:platform/systom/core/netcfg/netcfg.c
有看到一篇分析这个源码的link.有空可以看看

总结

还是得多看大佬的代码,逻辑和习惯得改
欢迎指错,一起学习鸭

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-09-04 17:39:38  更:2021-09-04 17:41:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:38:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码