在一些应用中,程序需要检测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;
else
usbChanged = true;
usbCnt = usbCnt_new;
if (usbChanged)
{
;//yes!
}
sleep(2000);
}while(true);
return 0;
}