2011-02-24 4 views
15

현재 Ubuntu 10.10에 연결된 USB 장치 목록을 얻으 려하고 UDev 및 D-BUS를 사용하여 장치를 연결하거나 분리하는 것과 같은 변경 사항을 모니터링하려고합니다. D-BUS를 사용하여 프로그래밍을하는 것이 상당히 익숙합니다. 한 예를 보았습니다 : Linux : How to detect is usb keyboard is plugged and unplugged 하나만 HAL을 사용하고 HAL이 사용되지 않음을 알고 있습니다. 일부 작동 코드를 발견하고 조금 수정했으나 USB 스틱, 미디어 플레이어 또는 CD-ROM 장치와 같은 모든 장치 전용 저장 장치에서 작동하지 않습니다. 나는 모든 것을 마우스, 키보드, 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 Romeo

+1

: 여기

#!/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의 예입니다 (나는이 코드를 정확히 찾고 일반 usb 처리기를 찾지 않았다.) iface = dbus.Interface (프록시, "org.freedesktop.UDisks.Device") to iface = dbus.Interface (proxy, "org.freedesktop.UDisks") 최소한 udisks 1.0.4가 사용됩니다. –

답변

10

udisks D-Bus 서비스는 분명히 디스크만을보고합니다.

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

도움을 주셔서 감사합니다. 나는 당신의 대답에 기초하여 뭔가를 얻을 수있었습니다. –

+0

콜백 함수는 실제로 어떻게 생겼을까요? 나는 'device-added'와 'device-changed'신호가 콜백으로 전달되는 매개 변수에 대한 정보를 찾지 못한다. 특정 idVendor와 idProduct가 연결된 장치가 연결되어 있는지 확인하고 싶습니다. 미리 감사드립니다. –

+0

@ con-f-use [pyudev.glib] (http://pyudev.readthedocs.org/en/latest/api/glib.html)에 나열된 것처럼 두 신호는 두 개의 인수로 콜백을 호출하며 두 번째 인수는 두 번째 인수 그 중 [device.attributes]에 속성이있는 [장치] (http://pyudev.readthedocs.org/en/latest/api/pyudev.html#pyudev.Device)가 있습니다 (http : //pyudev.readthedocs .org/ko/latest/api/pyudev.html # pyudev.Device.attributes). – ephemient

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가 연결되어 있는지 확인하기 위해 사용하는 것입니다 : 미래 참고로 python udisks - enumerating device information

+2

HAL은 최신 Linux 배포판에서 더 이상 사용되지 않으며 더 이상 사용되지 않습니다. – ephemient

+0

그건 내 문제도. 어쨌든 도움을 thx. –

+0

@ephemient 네 말이 맞습니다. 하지만 나는 "UDisks"를 사용하는 것은 그렇게 다를 수 없다고 생각합니다. @ Calota이게 당신에게 효과가 있기를 바랍니다. – savruk