2011-02-24 88 views
15

我試圖獲取列表中的USB設備在Ubuntu 10.10當前插入和監控發生變化,比如或縮小使用udev和d-BUS被插入的設備。我對使用D-BUS編程相當陌生。我看到一個例子:Linux : How to detect is usb keyboard is plugged and unplugged只有一個使用HAL,我知道HAL已被棄用。我發現了一些工作代碼,稍加修改,只適用於任何設備,如USB棒,媒體播放器或光盤設備。我希望整個事情鼠標,鍵盤,USB相機充電器任何插入到USB我想我的程序知道它。這基本上就是我所擁有的(http://moserei.de/2010/01/08/accessing-devicekit-with-dbus-and-python.html):USB設備udev和d-BUS

import dbus 
import gobject 
from dbus.mainloop.glib import DBusGMainLoop 

def device_added_callback(device): 
    print 'Device %s was added' % (device) 

def device_changed_callback(device): 
    print 'Device %s was changed' % (device) 

#must be done before connecting to DBus 
DBusGMainLoop(set_as_default=True) 

bus = dbus.SystemBus() 

proxy = bus.get_object("org.freedesktop.UDisks", 
         "/org/freedesktop/UDisks") 
iface = dbus.Interface(proxy, "org.freedesktop.UDisks.Device") 

devices = iface.get_dbus_method('EnumerateDevices')() 

print '%s' % (devices) 

#addes two signal listeners 
iface.connect_to_signal('DeviceAdded', device_added_callback) 
iface.connect_to_signal('DeviceChanged', device_changed_callback) 

#start the main loop 
mainloop = gobject.MainLoop() 
mainloop.run() 

任何幫助都會被認可。預先感謝您, Calota羅密歐

+1

供未來參考(我正在尋找這個代碼,而不是通用的USB處理程序),您需要更改: iface = dbus.Interface(proxy,「org.freedesktop.UDisks.Device」) 至少在使用udisks 1.0.4時,iface = dbus.Interface(代理,「org.freedesktop.UDisks」) 到 。 – 2012-11-27 10:26:24

回答

10

udisks D-Bus服務,顯然,只報告磁盤。

只是Monitor的udev直接(通過libudev,通過pyudev)。

import pyudev 
context = pyudev.Context() 
monitor = pyudev.Monitor.from_netlink(context) 
observer = pyudev.pygtk.GUDevMonitorObserver(monitor) 
observer.connect('device-added', device_added_callback) 
observer.connect('device-changed', device_changed_callback) 
monitor.enable_receiving() 
mainloop = gobject.MainLoop() 
mainloop.run() 
+0

感謝您的幫助,我設法根據您的答案找到工作。 – 2011-02-26 14:20:45

+0

回調函數如何看起來像?我沒有找到有關'device-added'和'device-changed'信號傳遞給回調參數的信息。我想查看是否連接了具有特定'idVendor'和'idProduct'的設備,並且可以使用一些幫助。提前致謝。 – 2012-08-31 22:48:43

+0

@ CON-F-使用成爲[pyudev.glib](http://pyudev.readthedocs.org/en/latest/api/glib.html),這兩個信號將調用它們的回調有兩個參數,第二列其中[device.attributes']是屬於[device](http://pyudev.readthedocs.org/en/latest/api/pyudev.html#pyudev.Device)(http://pyudev.readthedocs .ORG/EN /最新/ API/pyudev.html#pyudev.Device.attributes)。 – ephemient 2012-08-31 23:10:27

2

這是我用來列出已插入的閃存棒。您可以修改腳本,以您的需求

import dbus 
bus = dbus.SystemBus() 

proxy = bus.get_object("org.freedesktop.Hal", "/org/freedesktop/Hal/Manager") 
iface = dbus.Interface(proxy, "org.freedesktop.Hal.Manager") 

devices = iface.GetAllDevices() 

for device in devices: 
    try: 
     proxy1 = bus.get_object("org.freedesktop.Hal", device) 
     iface1 = dbus.Interface(proxy1, "org.freedesktop.Hal.Device") 
     props = iface1.GetAllProperties() 

     removable = iface1.GetProperty("storage.removable") 
     usb = iface1.GetProperty("storage.bus") 
     if usb== "usb": 
     print "\n".join(("%s: %s" % (k, props[k]) for k in props)) # shows available properties 
    except: 
    pass 

而且這是我用它來查看是否有任何USB插:

#!/usr/bin/python 
import dbus 
import gobject 

class DeviceAddedListener: 
       def __init__(self): 
           self.bus = dbus.SystemBus() 
           self.hal_manager_obj = self.bus.get_object("org.freedesktop.Hal", "/org/freedesktop/Hal/Manager") 
           self.hal_manager = dbus.Interface(self.hal_manager_obj,"org.freedesktop.Hal.Manager") 

           self.hal_manager.connect_to_signal("DeviceAdded", self._filter) 

       def _filter(self, udi): 
           device_obj = self.bus.get_object ("org.freedesktop.Hal", udi) 
           device = dbus.Interface(device_obj, "org.freedesktop.Hal.Device") 
           self.do_something(device) 

       def do_something(self, device): 
           try: 

               usb = device.GetProperty("storage.bus") 
               info = device.GetProperty("info.product") 
               removable = device.GetProperty("storage.removable") 
               print info 
           except: 
               pass#blah blah 


if __name__ == '__main__': 
       from dbus.mainloop.glib import DBusGMainLoop 
       DBusGMainLoop(set_as_default=True) 
       loop = gobject.MainLoop() 
       DeviceAddedListener() 
       loop.run() 

這裏是UDisks的例子: python udisks - enumerating device information

+2

依賴HAL,它已被棄用,不再出現在最新的Linux發行版中。 – ephemient 2011-02-25 17:19:10

+0

這也是我的問題。無論如何thx的幫助。 – 2011-02-26 14:20:19

+0

@ephemient是的,你是對的。但我認爲使用「UDisks」不可能如此不同。@ Calota我希望這適合你 – savruk 2011-02-28 07:39:22