日期:2014-05-16  浏览次数:20715 次

x86下 linux qt检测U盘插拔(一)------- HAL 与UDISKS

    利用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();