利用qt检测U盘插拔,思路有用qt的qdbus,dbus接收HAL的消息,或者是接收udisks的消息,这两种方法在x86平台上是可行的,但到板子里就不行。板子里不一定有HAL的,而HAL往板子里移植网上么有半点资料。udisk也没有移植的资料。更要命的是,不管hal也好udisks也好,他们得到的消息都是udev发过来的。而udev需要sysfs文件系统的支持,但现在arm板子上大多数都是yaffs或yaffs2文件系统的支持。尽管有udev移植的资料,但往yaffs、yaffs2文件系统移植,是移植不了的。最后一步配置的时候,配置不了。
洒家最终要在tiny210开发板上实现此功能,难道走投无路了么??非也,参考我的上篇博客,linux整个处理usb的消息机制是这样的:内核----hotplug机制----udev---------HAL/UDISKS--------dbus.尽管网上很多人说hotplug淘汰了,但貌似现在开发板上用的都是hotplug。因此如果要用qt实现检测arm上U盘插拔的话,hotplug才是正道,不要贪了qt封装好的几个QDBUS接口的函数!
这篇文章就先谈一下,pc机上用qt自带的qdbus类,得到hal或udisks消息,来实现检测U盘插拔。咱废话多不说,请看程序:
1,widget.h里面添加:
#include <QtDBus/QDBusInterface>
#include <QtDBus/QDBusConnection> //QDBusConnection
#define DBUS_HAL_SERVICE "org.freedesktop.Hal"
#define DBUS_HAL_PATH "/org/freedesktop/Hal/Manager"
#define DBUS_HAL_INTERFACE "org.freedesktop.Hal.Manager"
#define DBUS_HAL_DEVICE_PATH "/org/freedesktop/Hal/devices"
#define DBUS_HAL_DEVICE_INTERFACE "org.freedesktop.Hal.Device"
private slots:
void slotDeviceAdded(QString udi);
void slotDeviceRemoved(QString udi);
2,widget.cpp里面添加
QDBusInterface *dBusInterface = new QDBusInterface(DBUS_HAL_SERVICE,
DBUS_HAL_PATH,
DBUS_HAL_INTERFACE,
QDBusConnection::systemBus(),
this);
if(!dBusInterface->isValid())
qDebug()<<tc->toUnicode("初始化错误,找不到QDBusInterface!")<<QDBusConnection::systemBus().lastError().message();
connect(dBusInterface, SIGNAL(DeviceAdded(QString)), this, SLOT(slotDeviceAdded(QString)));
connect(dBusInterface, SIGNAL(DeviceRemoved(QString)), this, SLOT(slotDeviceRemoved(QString)));
然后就是两个槽函数:
void Widget::slotDeviceAdded(QString udi)
{
static int num = 0;
QDBusInterface *device = new QDBusInterface(DBUS_HAL_SERVICE, udi, DBUS_HAL_DEVICE_INTERFACE, QDBusConnection::systemBus(), this);
if(!device->isValid())
qDebug()<<tc->toUnicode("创建device失败!");
else
num++;
QString devicePath = device->path();
qDebug()<<tc->toUnicode("正在识别usb_device")<<num<<tc->toUnicode("号----路径:")<<devicePath;
if(devicePath.contains("volume"))
{
qDebug()<<tc->toUnicode("恭喜您,U盘找到了。name:")<<udi;
currentUDI = udi;
}
else
qDebug()<<tc->toUnicode("识别结果:不是USB存储设备!");
}
void Widget::slotDeviceRemoved(QString udi)
{
if(udi == currentUDI || udi.contains("volume"))
{
qDebug()<<tc->toUnicode("您的U盘已弹出!")<<udi;
currentUDI = "";
}
else
qDebug()<<"usb_device="<<udi<<tc->toUnicode("已弹出---");
}
这里的udi就是注册usb设备的路径!大家可以打印出来看看,注册的时候大概注册了七个,拔出U盘的时候也是打印了7个消息。如果没有前面头文件的.h里的define,可以在widget.CPP文件里new QDBusInterface时候直接写上。这里我推荐用这种先声明一个变量,然后连接槽函数的方法。网上有人做法如下:
// // QDBusConnection::systemBus().connect(DBUS_HAL_SERVICE,
// DBUS_HAL_PATH,
// DBUS_HAL_INTERFACE,
// "DeviceAdded",
// this,
// SLOT(slotDeviceAdded(QString )));
// QDBusConnection::systemBus().connect(DBUS_HAL_SERVICE,
// DBUS_HAL_PATH,
// DBUS_HAL_INTERFACE,
// "DeviceRemoved",
// this,
// SLOT(slotDeviceRemoved(QString )));
也是可以的!
最坑爹的是有些人只说DBUS_HAL_SERVICE、DBUS_HAL_PATH不交代前面的宏定义!
另外就是,如果不想通过hal得到消息,可以通过udisks得到消息,如下:
-
-
"org.freedesktop.UDisks",
-
"/org/freedesktop/UDisks",
-
"org.freedesktop.UDisks",
-
"DeviceAdded",
-
-
-
-
-
qDebug()<<"device added!"<<dev.path();
-
}
这样就是通过udisks来检测,至于原理大家看我前面博文把。
网上有个公开的用此思路写的较为完整的源码:http://download.csdn.net/detail/yanzi1225627/4507716,具体能运行否我没试。
另外,老外的http://qt-project.org/forums/viewthread/8595这个比较好。
分享到:
相关推荐
Qt-detect-Udisk老外写的qt检测U盘,没有使用hal或udisks,而是使用的tcpsocket和内核的netlink通信。可以在windows和linux上运行,据作者说正在测试wince平台。真牛啊。详见老外的资料链接:...
linux-embedded-hal Linux设备的Embedded-hal特性的实现该项目由Embedded Linux团队开发和维护。 执行linux-embedded-hal对Linux设备的Embedded-hal特性的实现该项目由Embedded Linux团队开发和维护。 文档GPIO字符...
hello every one.now day is membership
1.5 专题讨论:定义并撰写第一个HAL Stub 2.HAL Development 2.1 HAL Stub Analysis and Design (OOAD) 2.2 HAL Stub Class 2.3 HAL Stub Interface 2.4 专题讨论:开发 LED 的 HAL 模组 3.Android API Design ...
【HAL库每天一例】系列例程从今天开始持续更新。 我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程, 该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。 例程下载: 资料包括程序、...
参考“Description of STM32F1 HAL and low-layer driver”,人工翻译,如有错误请及时指出,仅供参考!!
正点原子 STM32F1开发指南-HAL库版本
gfx-hal-tutorials-源码.rar
PLUS-HAL - FreeRTOS.zip
STM32F4+W5500+cubeMX+HAL-利用SPI和以太网模块W5500进行通讯,完成UDP通讯。参考野火W5500例程
GPS-HAL-stm32,是很好用的GPS,stm32—HAL库程序,非常好用,不依赖任何外部库、包。使用非常方便。
通过一种方法将HATEOAS HAL链接转换为应用程序可以使用的URL。 处理缺少的链接,并将模板化的链接选项转换为查询字符串参数。 它与 HAL层完全兼容。 安装 npm install hateoas-hal-link-resolver 用法 Resolver是...
与不同,hal-json-normalizer支持HAL + JSON规范,这意味着您不必关心架构。 该库还支持。安装$ npm install hal-json-normalizer例子import normalize from 'hal-json-normalizer' ;const json = { id : 2620 , ...
android系统开发--HAL层开发基础
STM32F429开发指南-HAL库版本(正点原子 )
python库。 资源全名:kervi-hal-rpi-0.16.0.tar.gz
资源来自pypi官网。 资源全名:kervi-hal-win-0.7.4.tar.gz
hal-browser, 用于hal json媒体类型的API浏览器 浏览器用于hal json媒体类型的API浏览器示例用法下面是使用浏览器的hal json API示例:http://haltalk.herokuapp.com/explorer/browser.html关于 HALHAL是基于