x86下 linux qt檢測隨身碟插拔(一)——- HAL 與UDISKS

來源:互聯網
上載者:User
    利用qt檢測隨身碟插拔,思路有用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上隨身碟插拔的話,hotplug才是正道,不要貪了qt封裝好的幾個QDBUS介面的函數!

這篇文章就先談一下,pc機上用qt內建的qdbus類,得到hal或udisks訊息,來實現檢測隨身碟插拔。咱廢話多不說,請看程式:

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("恭喜您,隨身碟找到了。name:")<<udi;
        currentUDI = udi;
      }
    else
        qDebug()<<tc->toUnicode("識別結果:不是USB存放裝置!");

}

void Widget::slotDeviceRemoved(QString udi)
{

    if(udi == currentUDI || udi.contains("volume"))
    {
        qDebug()<<tc->toUnicode("您的隨身碟已彈出!")<<udi;
        currentUDI = "";
    }
    else
         qDebug()<<"usb_device="<<udi<<tc->toUnicode("已彈出---");
}

 

 這裡的udi就是註冊usb裝置的路徑!大家可以列印出來看看,註冊的時候大概註冊了七個,拔出隨身碟的時候也是列印了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得到訊息,如下:

  1. QDBusConnection::systemBus().connect(
  2.                          "org.freedesktop.UDisks",
  3.                          "/org/freedesktop/UDisks",
  4.                          "org.freedesktop.UDisks",
  5.                          "DeviceAdded",
  6.                          this, SLOT(deviceAdded(QDBusObjectPath));
  7.  
  8. void deviceAdded(QDBusObjectPath dev){
  9.  
  10.                          qDebug()<<"device added!"<<dev.path();
  11. }

這樣就是通過udisks來檢測,至於原理大家看我前面博文把。

網上有個公開的用此思路寫的較為完整的源碼:http://download.csdn.net/detail/yanzi1225627/4507716,具體能運行否我沒試。

另外,老外的http://qt-project.org/forums/viewthread/8595這個比較好。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.