用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;
        else
            usbChanged = true;
        usbCnt = usbCnt_new;

		if (usbChanged)
		{
            ;//yes!
		}

		sleep(2000);
    }while(true);
	
	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值