package com.gdcy.qldlgf;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Scanner;

/**
 * 生成机器码
 */
public class GeneratingMachineCode {
    /**
     * 生成序列号的main方法
     * @param args
     */
    public static void main(String[] args) {
        String property = System.getProperty("os.name").toLowerCase();
        String cpuSerialNumber = "";
        String hardDiskSerialNumber = "";
        String md5Result = "";
        if (property.contains("windows")) {
            // 获取cpu序列号
            cpuSerialNumber = GeneratingMachineCode.getCPUSerialNumber();
            // 获取 硬盘号
            hardDiskSerialNumber = GeneratingMachineCode.getHardDiskSerialNumber();
        } else if (property.contains("linux")) {
            // 获取cpu序列号
            cpuSerialNumber = GeneratingMachineCode.getUUID();
            // 获取 硬盘号
            hardDiskSerialNumber = GeneratingMachineCode.getBoisVersion();
        }
        // 获取到cpu序列号和硬盘号
        System.out.println("key:" + cpuSerialNumber + hardDiskSerialNumber);
    }

    /**
     * 获取CPU序列号(Windows)
     *
     * @return
     * @throws
     */
    public static String getCPUSerialNumber() {
        String serial;
        try {
            Process process = Runtime.getRuntime().exec(new String[]{"wmic", "cpu", "get", "ProcessorId"});
            process.getOutputStream().close();
            Scanner sc = new Scanner(process.getInputStream());
            serial = sc.next();
        } catch (IOException e) {
            throw new RuntimeException("获取CPU序列号失败");
        }
        return serial;
    }

    /**
     * 获取 硬盘序列号(Windows)
     *
     * @return
     * @throws
     * @throws InterruptedException
     */
    public static String getHardDiskSerialNumber() {
        String serial;
        try {
            Process process = Runtime.getRuntime().exec(new String[]{"wmic", "path", "win32_physicalmedia", "get", "serialnumber"});
            process.getOutputStream().close();
            Scanner sc = new Scanner(process.getInputStream());
            serial = sc.next();
        } catch (IOException e) {
            throw new RuntimeException("获取硬盘序列号失败");
        }
        return serial;
    }

    /**
     * 注:liunx上 如果想获取的话  需要root用户来执行 ;如果使用普通用户 执行的话  需要输入当前用户的密码(普通用户不支持dmidecode命令 因为没权限)
     */

    /**
     * bois版本号(linux)
     *
     * @return
     */
    public static String getBoisVersion() {
        String result = "";
        Process p;
        try {
            p = Runtime.getRuntime().exec("sudo dmidecode -s bios-version");// 管道
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line;
            while ((line = br.readLine()) != null) {
                result += line;
                break;
            }
            br.close();
        } catch (IOException e) {
            System.out.println("获取主板信息错误");
        }
        return result;
    }


    /**
     * 获取系统序列号(linux)
     *
     * @return
     */
    public static String getUUID() {
        String result = "";
        try {
            Process process = Runtime.getRuntime().exec("sudo dmidecode -s system-uuid");
            InputStream in;
            BufferedReader br;
            in = process.getInputStream();
            br = new BufferedReader(new InputStreamReader(in));
            while (in.read() != -1) {
                result = br.readLine();
            }
            br.close();
            in.close();
            process.destroy();
            // System.out.println("获取序列号:"+result);
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return result;
    }
}