【国产桌面操作系统开发】获取系统硬件信息

前言

        工具型的项目,多少要跟硬件打交道,我在国产系统(统信UOS系统和麒麟kylin系统)中开发的QT项目也多是工具,主要涉及CPU、硬盘大小、内存大小、本地IP地址、USB设备、串并口设备、打印机等。

获取CPU信息

lscpu

可以列举出芯片等信息,cat /proc/cpuinfo可以更详细一些的内容,但有用度低。

dmidecode

命令行dmidecode主要是存储硬件设备厂商按照标准化填写的硬件信息,信息非常丰富,比如可以获取到CPU的ID和序列号,作为本系统的唯一值(比如注册激活功能会用到):

//获取CPU ID
dmidecode -t Processor | grep ID |head -n1 |awk -F 'ID:' '{print $2}' 
//获取CPU 序列号
dmidecode -t Processor | grep Serial |awk -F ': ' '{print $2}'

获取CPU名称:

dmidecode -t processor|grep Manufacturer|awk -F ':' '{print $2}'

获取内存信息

通过文件/proc/meminfo获取,内存总大小可以通过累加获取


std::string getMemTotal()
{
    std::string result = "0";
    char cmdstr[100]="cat /proc/meminfo |grep MemTotal";
    char buffer[128]={0};

    FILE* pipe = popen(cmdstr, "r");
    if (!pipe) {
        std::cerr << "Error opening pipe" << std::endl;
        return "";
    }
    while (fgets(buffer, 128, pipe) != NULL) {
        //std::cout << "buffer: " << buffer << std::endl;
        // 按照 ' ' 分割字符串  MemTotal:        8082664 kB
        std::vector<std::string> strlist = split(buffer, ':');
        if(strlist.size()<2) continue;
        //std::cout << "buffer: " << strlist[1] << std::endl;
        std::string memorystr=strlist[1];
        int number = std::atoi(memorystr.c_str());
        //double size = number/1024/1024.0;
        int size = number/1000/1000;
        result = std::to_string(size);
    }
    pclose(pipe);
    result += "GB";
}

获取硬盘大小

通过命令行lsblk获取,也是通过累加方式

std::string getDisksize(){
    std::string result = "";
    char cmdstr[100]="lsblk|grep disk|awk -F ' ' '{print $4}'|tr -d '\n'";
    char buffer[128]={0};

    FILE* pipe = popen(cmdstr, "r");
    if (!pipe) {
        std::cerr << "Error opening pipe" << std::endl;
        return "";
    }
    while (fgets(buffer, 128, pipe) != NULL) {
        result += buffer;
    }
    pclose(pipe);
    return result;
}

获取本地IP地址

通过命令行hostname获取:hostname -I|awk -F ' ' '{print $1}'

获取系统名称

通过命令行hostnamectl获取:hostnamectl |grep Operating|awk -F ':' '{print $2}'

获取USB设备

lsusb及libusb

通过命令行lsusb,列出当前系统中所有可用的USB设备(鼠标、键盘、HUB、U盘、摄像头等),它可显示每个设备的简要信息,包括【系统分配】的BUS(线路)、Device(设备号),【厂商标注的】ID(Vendor ID--厂商ID和Product ID--产品ID)、产品名称等,如下图所示。

需要获取详细信息时,使用命令行:lsusb -d [vid:pid] -v   ,如下图所示。

如果想要C++开发获取系统的USB信息,可以使用libusb库,统信UOS系统和麒麟kylin系统执行以下命令进行下载:

sudo apt install libusb-1.0-0-dev

开发可以参考博文:【Linux C/C++开发】libusb库操作-获取USB设备信息

注意事项:libusb库的缺点是获取名称描述时会出现空白的情况,本人使用线程调用后台命令行lsusb来获取设备名称来补充,这里要注意,统信UOS系统插入某些USB设备,会导致lsusb命令卡10秒钟,一定要用线程异步的方式来处理。

udevadm及libudev

        使用命令行udevadm info --query=all --name=/dev/sda  可以查看指定设备的详细信息,比lsusb更详细更有用,其中--name=/dev/sda 是要指定的设备的路径,这个路径可以通过libudev库获取。

获取串并口

        串口和并口文件都在/dev目录下,系统默认的串口文件通常是tty或者ttyS开头,Linux下有个常用的串口测试工具是cutecom,直接apt install cutecom即可下载;系统默认的并口文件通常是lp开头(比如lp0、lp1),有些时候,只有一个并口,但在/dev下能看到两个并口文件,一个是CPU预留的,没有用,通常只有lp0是有效的,这个时候用并口插上一个免驱动的(老式)打印机,使用命令sudo date > /dev/lp0即可测试并口文件是否有效。

获取打印机

        Linux使用打印机是CUPS,是苹果贡献给UNIX的,Linux适配成systemV标准之后,Linux的各个发行版本都使用CUPS做为打印机管理软件,这是开源的软件,统信UOS和麒麟kylin都预装有CUPS,在工具栏搜【打印机】即可界面操作,如果是项目开发需要后台命令行,可以用:

lpstat -v

如果是要新增或者删除打印机就用lpadmin命令,如果不想开发,可以下载工具system-config-printer,这个工具比系统自带的好用。

sudo apt install system-config-printer

如果是要进行C/C++开发,下载libcups2-dev,引用头文件#include <cups/cups.h>

sudo apt install cups libcups2-dev

另外要提的一点是,CUPS有自带的打印机驱动,但是这些驱动不可能比window系统的驱动多,很多厂商并没有开发那么多Linux下的驱动,所以如果存在利旧的场景时,可以打通国产系统和window之间的【打印机】通道,让用户无感知的在国产系统是使用window的打印机功能(即在国产电脑上的操作跟在window上的操作习惯是一样,但使用的是window安装调试好的打印驱动进行任务处理)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oCy

打赏叫号~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值