背景:使用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
}
处理后的效果如下: