前言
工具型的项目,多少要跟硬件打交道,我在国产系统(统信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安装调试好的打印驱动进行任务处理)。

5466

被折叠的 条评论
为什么被折叠?



