神技能)"/>
用50行代码实现Linux系统usb设备插拔检测(基于Qt的神技能)
在一些应用中,程序需要检测usb设备的插拔操作,网上提供多种实现方法,实现代码复杂,大部分都要需要了解usb设备或者linux系统的一些细节知识。
本文介绍一种简单有效的办法,不需要了解usb接口背后的细节,借助linux系统提供的lsusb命令和Qt的QProcess类即可实现。而且无偿说明原理,附上源代码,真的不到50行,而且完全不需要下载,不需要C币(你懂的)。
原理
1、lsusb命令
linux系统lsusb命令能够列举已经系统接入的usb设备,这个命令非常简单,看图秒懂。
我们只需要知道-d这个参数,提供usb的venderID和productID,就能进一步精准查询usb设备的类型。如果还不了解usb的这两个重要ID,这个百度一下,很简单。当然不了解也没关系。
2、QProcess
类QProcess是Qt提供的启动外部进程的类,这个类有很多超级有用的接口,我们使用的接口是QByteArray QProcess::readAllStandardOutput(),这个接口能返回启动进程的输出。例如我们用QProcess启动了命令lsusb,那么lsusb命令的输出都能获得,得到了输出,根据输出的行数,就能判断系统插入了多个usb设备。
实现
说到这里,估计聪明的同学已经知道代码怎么写了,最简单的测试代码真的不到50行哦:
#include <QCoreApplication>
#include <QProcess>
int usbCount(const QString& vender)
{QProcess process;QStringList args;if (!vender.isEmpty()){args.append("-d");args.append(vender);process.start("lsusb", args);}else{process.start("lsusb");}bool bres = process.waitForFinished();QString result = QString(process.readAllStandardOutput());QStringList outputList = result.split("\n");return outputList.count(); //返回可能包含一行空字符行,但是不影响检测结果
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int usbCnt = -1;bool usbChanged = true;QString argd=QString("096e:0303"); //usb设备的venderID和productID,这个是可以预知的,当然不输入也可以do{int usbCnt_new = usbCount( argd);if (usbCnt == usbCnt_new)usbChanged = false;elseusbChanged = true;usbCnt = usbCnt_new;if (usbChanged){;//yes!}sleep(2000);}while(true);return 0;
}
更多推荐
用50行代码实现Linux系统usb设备插拔检测(基于Qt的神技能)
发布评论