欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

x86下 linux qt檢測U盤插拔(一)------- HAL

系統 4909 0

  利用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得到消息,如下:  

 QDBusConnection                    ::  systemBus  (  ).  connect  (  
 "org.freedesktop.UDisks"  ,  
 "/org/freedesktop/UDisks"  ,  
 "org.freedesktop.UDisks"  ,  
 "DeviceAdded"  ,  
 this  , SLOT  (deviceAdded  (      QDBusObjectPath                    )  )  ;  
 
 void deviceAdded  (      QDBusObjectPath                   dev  )  {  
 
 qDebug  (  )  <<  "device added!"  <<dev.  path  (  )  ;  
 }

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

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

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



更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 特黄特色大片免费高清视频 | 国产精品19禁在线观看2021 | 免费观看毛片 | 97精品国产高清久久久久蜜芽 | 91精品国产综合久久国产大片 | 日本中文字幕高清 | 日本福利视频 | 亚洲视频 欧美视频 | 五月综合激情 | 欧美二级毛片免费高清电影 | 91视频区| 少妇特黄A片一区二区三区免费看 | 91精品久久久久久久久久 | 成人一级片在线观看 | 91精品国产综合久久婷婷香蕉 | 午夜视频日本 | 精品小视频 | 久草在线精品视频 | 欧美一级片免费看 | 久久精品视频18 | jzzjlzz亚洲乱熟在线播放 | 国产999精品久久久久久 | 欧美福利视频一区二区三区 | 亚洲经典在线中文字幕 | 啪啪激情综合 | 久久久国产视频 | 狠狠操麻豆 | 91最新免费观看在线 | aⅴ在线免费观看 | 99爱在线观看 | 亚洲免费久久 | 国产亚洲精品一区二区 | 国产精品第9页 | 天天综合久久 | 亚洲精品国偷拍自产在线观看 | 国产午夜精品一区二区三区嫩草 | 国产小视频在线高清播放 | 欧美日韩一区二区视频在线观看 | 久久久九九精品国产毛片A片 | 亚洲成人一区 | 波多野结衣三级在线 |