首页 前端知识 vue获取设备硬件信息

vue获取设备硬件信息

2024-03-24 22:03:55 前端知识 前端哥 626 94 我要收藏

背景:使用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
}

处理后的效果如下:

转载请注明出处或者链接地址:https://www.qianduange.cn//article/4081.html
标签
electron
评论
会员中心 联系我 留言建议 回顶部
复制成功!