java获取机器号_(转)JAVA获得机器码的实现

http://yangshangchuan.iteye.com/blog/2012401

首先,定义了一个统一的接口,以支持不同操作系统不同实现的透明切换:

Java代码  收藏代码

/**

*生成机器码的接口,不同平台有不同实现

* @author 杨尚川

*/

public interface SequenceService {

/**

* 获取机器码

* @return  机器码

*/

public String getSequence();

}

其次,定义了一个抽象类,实现了一些通用的功能,如生成MD5摘要、将很长的字符串以固定的位数分割开,以便于人类阅读(如将机器码 71F5DA7F495E7F706D47F3E63DC6349A 每4个一组,以-分割为71F5-DA7F-495E-7F70-6D47-F3E6-3DC6-349A)、利用sigar来生成机器码。这里需要在pom.xml中加入sigar依赖。

Xml代码  收藏代码

org.fusesource

sigar

1.6.4

log4j

log4j

Java代码  收藏代码

import org.apdplat.module.system.service.PropertyHolder;

import org.apdplat.platform.log.APDPlatLogger;

import org.apdplat.platform.util.ConvertUtils;

import org.apdplat.platform.util.FileUtils;

import java.io.File;

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.HashSet;

import java.util.Properties;

import java.util.Set;

import org.apdplat.platform.log.APDPlatLoggerFactory;

import org.hyperic.sigar.Mem;

import org.hyperic.sigar.NetFlags;

import org.hyperic.sigar.NetInterfaceConfig;

import org.hyperic.sigar.Sigar;

/**

*机器码生成的通用服务

* @author 杨尚川

*/

public abstract class AbstractSequenceService   implements SequenceService{

protected final APDPlatLogger LOG = APDPlatLoggerFactory.getAPDPlatLogger(getClass());

/**

* 对一段String生成MD5摘要信息

* @param message 要摘要的String

* @return 生成的MD5摘要信息

*/

protected String getMD5(String message) {

message += "{apdplat}";

try {

MessageDigest md = MessageDigest.getInstance("MD5");

LOG.debug("MD5摘要长度:" + md.getDigestLength());

byte[] b = md.digest(message.getBytes("utf-8"));

String md5 = ConvertUtils.byte2HexString(b)+message.length();

return getSplitString(md5);

} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {

LOG.error("MD5摘要失败",e);

}

return null;

}

/**

* 将很长的字符串以固定的位数分割开,以便于人类阅读

* @param str

* @return

*/

protected String getSplitString(String str){

return getSplitString(str, "-", 4);

}

/**

* 将很长的字符串以固定的位数分割开,以便于人类阅读

* 如将

* 71F5DA7F495E7F706D47F3E63DC6349A

* 以-,每4个一组,则分割为

* 71F5-DA7F-495E-7F70-6D47-F3E6-3DC6-349A

* @param str 字符串

* @param split 分隔符

* @param length 长度

* @return

*/

protected String getSplitString(String str, String split, int length){

int len=str.length();

StringBuilder temp=new StringBuilder();

for(int i=0;i

if(i%length==0 && i>0){

temp.append(split);

}

temp.append(str.charAt(i));

}

String[] attrs=temp.toString().split(split);

StringBuilder finalMachineCode=new StringBuilder();

for(String attr : attrs){

if(attr.length()==length){

finalMachineCode.append(attr).append(split);

}

}

String result=finalMachineCode.toString().substring(0, finalMachineCode.toString().length()-1);

return result;

}

/**

* 利用sigar来生成机器码,当然这个实现不是很好,无法获得CPU ID,希望有兴趣的朋友来改进这个实现

* @param osName 操作系统类型

* @return 机器码

*/

protected String getSigarSequence(String osName) {

try {

File libFile = new File(FileUtils.getAbsolutePath("/WEB-INF/lib/"+PropertyHolder.getProperty("libsigar."+osName)));

LOG.debug("libsigar."+osName+" : "+libFile.getAbsolutePath());

System.load(libFile.getAbsolutePath());

Set result = new HashSet<>();

Sigar sigar = new Sigar();

String[] ifaces = sigar.getNetInterfaceList();

for (String iface : ifaces) {

NetInterfaceConfig cfg = sigar.getNetInterfaceConfig(iface);                if (NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress()) || (cfg.getFlags() & NetFlags.IFF_LOOPBACK) != 0

|| NetFlags.NULL_HWADDR.equals(cfg.getHwaddr())) {

continue;

}

String mac = cfg.getHwaddr();

result.add(mac);

LOG.debug("mac: " + mac);

}

if(result.size()<1){

return null;

}

Properties props = System.getProperties();

String javaVersion = props.getProperty("java.version");

result.add(javaVersion);

LOG.debug("Java的运行环境版本:    " + javaVersion);

String javaVMVersion = props.getProperty("java.vm.version");

result.add(javaVMVersion);

LOG.debug("Java的虚拟机实现版本:    " + props.getProperty("java.vm.version"));

String osVersion = props.getProperty("os.version");

result.add(osVersion);

LOG.debug("操作系统的版本:    " + props.getProperty("os.version"));

Mem mem = sigar.getMem();

// 内存总量

String totalMem = mem.getTotal() / 1024L + "K av";

LOG.debug("内存总量:    " + totalMem);

result.add(totalMem);

LOG.debug("result:    " + result);

String machineCode = getMD5(result.toString());

return machineCode;

} catch (Throwable ex) {

LOG.error("生成 "+osName+" 平台下的机器码失败", ex);

}

return null;

}

}

最后,我们分别看看不同平台的实现。

Windows:

Java代码  收藏代码

/**

*在Windows平台上生成机器码

* @author 杨尚川

*/

public final class WindowsSequenceService extends AbstractSequenceService{

@Override

public String getSequence() {

String cpuID=getCPUSerial();

String hdID=getHDSerial("C");

if(cpuID==null || hdID==null){

return null;

}

String machineCode = getMD5(cpuID+hdID);

return machineCode;

}

/**

*

* @param drive 硬盘驱动器分区 如C,D

* @return 该分区的卷标

*/

private String getHDSerial(String drive) {

StringBuilder result = new StringBuilder();

try {

File file = File.createTempFile("tmp", ".vbs");

file.deleteOnExit();

try (FileWriter fw = new java.io.FileWriter(file)) {

String vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n"

+ "Set colDrives = objFSO.Drives\n" + "Set objDrive = colDrives.item(\"" + drive + "\")\n"

+ "Wscript.Echo objDrive.SerialNumber";

fw.write(vbs);

}

Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());

try (BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {

String line;

while ((line = input.readLine()) != null) {

result.append(line);

}

}

file.delete();

} catch (Throwable e) {

LOG.error("生成HDSerial失败", e);

}

if (result.length() < 1) {

LOG.info("无磁盘ID被读取");

}

return result.toString();

}

/**

* 获取CPU号,多CPU时,只取第一个

* @return

*/

private String getCPUSerial() {

StringBuilder result = new StringBuilder();

try {

File file = File.createTempFile("tmp", ".vbs");

file.deleteOnExit();

try (FileWriter fw = new FileWriter(file)) {

String vbs = "On Error Resume Next \r\n\r\n" + "strComputer = \".\"  \r\n"

+ "Set objWMIService = GetObject(\"winmgmts:\" _ \r\n"

+ "    & \"{impersonationLevel=impersonate}!\\\\\" & strComputer & \"\\root\\cimv2\") \r\n"

+ "Set colItems = objWMIService.ExecQuery(\"Select * from Win32_Processor\")  \r\n "

+ "For Each objItem in colItems\r\n " + "    Wscript.Echo objItem.ProcessorId  \r\n "

+ "    exit for  ' do the first cpu only! \r\n" + "Next                    ";

fw.write(vbs);

}

Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());

try (BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {

String line;

while ((line = input.readLine()) != null) {

result.append(line);

}

}

file.delete();

} catch (Throwable e) {

LOG.error("生成CPUSerial失败", e);

}

if (result.length() < 1) {

LOG.info("无CPU_ID被读取");

}

return result.toString();

}

public static void main(String[] args) {

SequenceService s = new WindowsSequenceService();

String seq = s.getSequence();

System.out.println(seq);

}

}

Linux:

Java代码  收藏代码

/**

*在Linux平台上生成机器码

* @author 杨尚川

*/

public class LinuxSequenceService  extends AbstractSequenceService{

@Override

public String getSequence() {

return getSigarSequence("linux");

}

public static void main(String[] args) {

SequenceService s = new LinuxSequenceService();

String seq = s.getSequence();

System.out.println(seq);

}

}

Mac OS X:

Java代码  收藏代码

/**

*在Mac OS X平台上生成机器码

* @author 杨尚川

*/

public class MacSequenceService    extends AbstractSequenceService{

@Override

public String getSequence() {

return getSigarSequence("mac");

}

public static void main(String[] args) {

SequenceService s = new MacSequenceService();

String seq = s.getSequence();

System.out.println(seq);

}

}

Solaris:

Java代码  收藏代码

/**

*在Solaris平台上生成机器码

* @author 杨尚川

*/

public class SolarisSequenceService    extends AbstractSequenceService{

@Override

public String getSequence() {

return getSigarSequence("solaris");

}

public static void main(String[] args) {

SequenceService s = new SolarisSequenceService();

String seq = s.getSequence();

System.out.println(seq);

}

}

已有 0 人发表留言,猛击->> 这里<

ITeye推荐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多款主流编程语言,哪款开发软件最安全?

喜欢就关注我们吧&#xff01;在当下的市场环境中&#xff0c;除了掌握困扰软件的最常见安全问题外&#xff0c;开发人员还应该了解到底是什么问题在影响他们正在使用的编程语言。静态代码分析安全公司 Veracode 最近发布了一份年度软件安全状态&#xff08;SOSS&#xff09;报…

Java pdf文件传输_java中pdf文件的管理(pdf文件转png文件,base64传输文件以及删除)...

org.apache.pdfboxpdfbox2.0.12影像文件转为base64编码使用java自带的BASE64Encoder类代码部分&#xff1a;前端上传文件的保存&#xff1a;RequestMapping("upLoadImgs")ResponseBodypublic String upLoadAgreementsImg(HttpServletResponse response, HttpServletR…

【对比学习】koa.js、Gin与asp.net core——中间件

web框架中间件对比编程语言都有所不同&#xff0c;各个语言解决同一类问题而设计的框架&#xff0c;确有共通之处&#xff0c;毕竟是解决同一类问题&#xff0c;面临的挑战大致相同&#xff0c;比如身份验证&#xff0c;api授权等等&#xff0c;鄙人对node.js&#xff0c;golan…

java 传送解析8583报文_java发送ISO8583报文接口案例

【实例简介】java发送ISO8583报文实现平安银行支付接口【实例截图】【核心代码】pingAnBank└── pingAnBank├── build.xml├── client│ ├── ClientBean.java│ ├── UDPClient.java│ └── UdpClientSocket.java├── com│ └── solab│ └── i…

2020年终回顾:时间会回答成长,成长会回答梦想

前言2020年是脚踏实地&#xff0c;慢慢成长的一年&#xff0c;由于疫情的缘故&#xff0c;今年社区没有像去年一样举办多场线下活动&#xff0c;不过 .NET CONF CHINA 大会昨天也在苏州顺利召开&#xff0c;回顾这一年&#xff0c;也有不少惊喜与感悟2020年回顾公众号自从去年双…

java servlet 跳转_Servlet跳转方式sendReDirect()和forward()

在web应用服务中&#xff0c;经常会面对不同SERVLET之间的跳转&#xff0c;目前我们可以通过以下两种方式实现&#xff1a;1.RequestDispatcher.forward()2.ServletResponse.sendReDirect()两者的区别&#xff1a;1.redirect 方式可以跨应用访问,forward 只能在同一个应用中跳转…

明天面腾讯,我刷了这71道面试题...

激动人心的Conf 2020中国.NET开发者大会完美落幕&#xff0c;有幸去到现场&#xff0c;跟诸位.NET大佬、微软大咖、MVP面对面交流&#xff0c;内心很是鸡冻&#xff01;聊天中我注意到一个细节&#xff0c;很多公司的项目都在逐步用MySQL替换SQLServer&#xff0c;尤其是微服务…

java 毕向东 内部类_java基础内部类(毕向东老师)

内部类//特点&#xff1a;内部类可以直接访问外部类的成员&#xff0c;//外部类要访问内部类中的成员必须创建内部类的对象。//为什么要定义内部类呢&#xff1f;类是用于描述事物的&#xff0c;而事务中如果还有具体的事物&#xff0c;而且这个内部的事物在访问着所属事物中的…

java字符串切分_Java字符串分割(转)

java.lang.String的split()方法, JDK 1.4 or laterpublic String[] split(String regex,int limit)示例代码public class StringSplit {public static void main(String[] args) {String sourceStr "1,2,3,4,5";String[] sourceStrArray sourceStr.split(",&q…

面试官:. NET5源码里用到了哪些设计模式?懵!

作为微软最早迈向开源的重要软件之一&#xff0c;.NET 5的发布具有重要意义&#xff01;微软希望 .NET Framework 开发者能够迁移他们的代码和应用到 .NET 5.0 上&#xff0c;为明年发布的 .NET 6.0 将 Xamarin 开发者过渡到统一平台奠定基础。版本发布时间轴&#xff1a;.NET …

ldap java 密码_用java进行LDAP用户登陆(用户认证)及修改密码

一、用户认证public String execute(){Hashtable env new Hashtable();String LDAP_URL "ldap://8.8.8.8:389"; // LDAP访问地址env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");env.put(Context.PROVIDER_URL, LDAP_URL)…

C# 中 ConcurrentDictionary 一定线程安全吗?

根据 .NET 官方文档的定义&#xff1a;ConcurrentDictionary<TKey,TValue> Class 表示可由多个线程同时访问的线程安全的键/值对集合。这也是我们在并发任务中比较常用的一个类型&#xff0c;但它真的是绝对线程安全的吗&#xff1f;仔细阅读官方文档&#xff0c;我们会发…

java 3des 32位密钥_3des,java_java 中32位秘钥长度的 3des加密方法?,3des,java - phpStudy...

java 中32位秘钥长度的 3des加密方法&#xff1f;java中 3des加密 默认是24位秘钥的现在需求是 32位秘钥加密尝试很多种方法 解决 结果都不正确// 密钥private final static String secretKey "11111111111111111111111111111111";// 向量// private final static S…

2020 .NET 开发者峰会顺利在苏州落幕,相关数据很喜人以及线上直播回看汇总

在2019年上海中国.NET开发者大会的基础上&#xff0c;2020年12月19-20日 继续以“开源、共享、创新” 为主题的第二届中国 .NET 开发者峰会&#xff08;.NET Conf China 2020&#xff09;在苏州人工智能智能产业创新中心落下帷幕&#xff0c;本次大会以线下城市苏州为中心&…

java怎么判断数据类型_数据类型判断

[java]代码库import java.util.*; public class Main{public static void main(String[] args) {Scanner scan = new Scanner(System.in); String s = scan.nextLine(); String []str = s.split(" "); int i, j; for(i = 0; i < str.length; i++) {if(i != 0) Sys…

.NET 云原生架构师训练营(模块二 基础巩固 REST RESTful)--学习笔记

2.3.1 Web API -- REST && RESTful什么是 REST&#xff0c;什么是 RESTfulRESTful API 设计RESTful 成熟度模型什么是 REST&#xff0c;什么是 RESTful理解RESTful架构&#xff1a;https://www.ruanyifeng.com/blog/2011/09/restful.htmlREST&#xff08;Representatio…

vue 一个组件内多个弹窗_论如何用Vue实现一个弹窗-一个简单的组件实现

前言最近在使用element-ui框架&#xff0c;用到了Dialog对话框组件&#xff0c;大致实现的效果&#xff0c;跟我之前自己在移动端项目里面弄的一个弹窗组件差不太多。然后就想着把这种弹窗组件的实现方式与大家分享一下&#xff0c;下面本文会带着大家手摸手实现一个弹窗组件。…

拆分路径 java_JAVA 类文件中的路径如何拆分和替换

我做Swing的时候文件要放绝对路径&#xff0c;相对路径出不来&#xff01;所以我用如果我的类放在D:\aaa\Class里Thread.currentThread().getContextClassLoader().getResource("");MenuTest.class.getClas...我做Swing的时候文件要放绝对路径&#xff0c;相对路径出…

为 CefSharp 应用内置 C++ 运行环境并启用 AnyCPU 支持

一个 CefSharp 应用程序要想正确运行&#xff0c;有两个必要条件&#xff1a;.NET Framework 4.5.2VC 2015在部署 CefSharp 应用时经常会遇到因为没有 VC 2015 而无法运行的问题&#xff1a;通过事件查看器&#xff0c;可以观察到一个类型为&#xff1a;System.IO.FileNotFound…

java file rename 失败_java重命名文件造成文件不可读写

我想使用java代码对nginx日志文件进行拆分&#xff0c;但是我发现代码执行之后&#xff0c;拆分出来的日志文件没有读写权限&#xff0c;查看文件属性&#xff0c;显示的很诡异&#xff1a;点击高级按钮&#xff0c;显示你没有权限查看或者编辑这个对象的权限设置&#xff1a;反…