背景:使用electron做桌面应用时,服务器端需要提供设备硬件信息
话不多说开始正题:
1. 获取操作系统及其版本
const getOsInfo = () => { var userAgent = navigator.userAgent.toLowerCase() let name = 'Unknown' let version = 'Unknown' if (userAgent.indexOf('win') > -1) { name = 'Windows' if (userAgent.indexOf('windows nt 5.0') > -1) { version = 'Windows 2000' } else if ( userAgent.indexOf('windows nt 5.1') > -1 || userAgent.indexOf('windows nt 5.2') > -1 ) { version = 'Windows XP' } else if (userAgent.indexOf('windows nt 6.0') > -1) { version = 'Windows Vista' } else if ( userAgent.indexOf('windows nt 6.1') > -1 || userAgent.indexOf('windows 7') > -1 ) { version = 'Windows 7' } else if ( userAgent.indexOf('windows nt 6.2') > -1 || userAgent.indexOf('windows 8') > -1 ) { version = 'Windows 8' } else if (userAgent.indexOf('windows nt 6.3') > -1) { version = 'Windows 8.1' } else if ( userAgent.indexOf('windows nt 6.2') > -1 || userAgent.indexOf('windows nt 10.0') > -1 ) { version = 'Windows 10' } else { version = 'Unknown' } } else if (userAgent.indexOf('iphone') > -1) { name = 'Iphone' } else if (userAgent.indexOf('mac') > -1) { name = 'Mac' } else if ( userAgent.indexOf('x11') > -1 || userAgent.indexOf('unix') > -1 || userAgent.indexOf('sunname') > -1 || userAgent.indexOf('bsd') > -1 ) { name = 'Unix' } else if (userAgent.indexOf('linux') > -1) { if (userAgent.indexOf('android') > -1) { name = 'Android' } else { name = 'Linux' } } else { name = 'Unknown' } return { name, version } } // console.log(getOsInfo()) objInfo.value.osinfo.system = getOsInfo().name objInfo.value.osinfo.version = getOsInfo().version
复制
2. 使用os模块获取操作系统信息
官网地址附上:
os 操作系统 | Node.js v20 文档
// os获取操作系统信息 const os = require('os') const arch = os.arch() // cpu架构 const kernel = os.type() // 操作系统内核 const pf = os.platform() // 操作系统平台 const uptime = os.uptime() // 系统开机时间 // dealTime(uptime) // dealTime 处理时间格式 const hn = os.hostname() // 主机名 const hdir = os.homedir() // 主目录 const totalMem = os.totalmem() // 内存大小 const freeMem = os.freemem() // 空闲内存 // dealMem(totalMem) dealMem(freeMem) // dealMem 处理内存格式 const cpus = os.cpus() //cpu信息 // 网卡信息 const networksObj = os.networkInterfaces() for (let nw in networksObj) { let objArr = networksObj[nw] // 这里objArr 已经获取了网卡信息 下面是获取指定字段的信息 objArr.forEach((obj, idx) => { // console.log(obj) // 逻辑 }) }
复制
tips:上面涉及两段处理格式的方法,代码附上
// 时间格式转换 var dealTime = (seconds) => { var seconds = seconds | 0 var day = (seconds / (3600 * 24)) | 0 var hours = ((seconds - day * 3600) / 3600) | 0 var minutes = ((seconds - day * 3600 * 24 - hours * 3600) / 60) | 0 var second = seconds % 60 day < 10 && (day = '0' + day) hours < 10 && (hours = '0' + hours) minutes < 10 && (minutes = '0' + minutes) second < 10 && (second = '0' + second) return [day, hours, minutes, second].join(':') } // 内存格式转换 var dealMem = (mem) => { var G = 0, M = 0, KB = 0 mem > 1 << 30 && (G = (mem / (1 << 30)).toFixed(2)) mem > 1 << 20 && mem < 1 << 30 && (M = (mem / (1 << 20)).toFixed(2)) mem > 1 << 10 && mem > 1 << 20 && (KB = (mem / (1 << 10)).toFixed(2)) return G > 0 ? G + 'G' : M > 0 ? M + 'M' : KB > 0 ? KB + 'KB' : mem + 'B' }
复制
3. (重点)通过nodejs的child_process使用shell执行wmic指令
3.1 下载 child_process 包
yarn add child_process
复制
3.2 调用.execSync方法执行指令
const childProcess = require('child_process') // CmdStr 为传入的操作指令 const getInfoUseVmic = (CmdStr) => { try { let res = childProcess .execSync(CmdStr) return res } catch (e) { console.error(e) } return }
复制
3.3 问题:由此获取的数据均为 Uint8阵列 格式的需转换
Uint8阵列展示:
\
我这里使用的 toString() 的方式转换的,效果如下:
对,你没有看错,上面一大串数据就变成了下面简单的两句
3.4 问题此方法只能小规模的使用shell且符号和语法冲突,可读性差
比如我这里获取cpu的信息列表,结果如下:
缺点: 数据几乎无格式,获取到的结果可用性较低
优点: 通过指令获取设备硬件的序列号等等具有唯一性的东西,比如获取cpu序列号,主板序列号等等
有更好的方法的大佬看到了踢一脚,万分感谢!!!
3.5 下面是我对 Uint8阵列 数据的处理
const getInfoUseVmic = (CmdStr) => { try { let res = childProcess .execSync(CmdStr) .toString() .replace(/\r/g, '') .split('\n') return res } catch (e) { console.error(e) } return }
复制
处理后的效果如下: