我的Perl脚本如何反应到使用UDev而不是HAL的任意设备?

我想用一个简单的Perl脚本来做一些configuration,例如我的蓝牙耳机。 我尝试使用Net :: DBus ,但我的OS / DE(Fedora 17,GNOME3)不再使用HAL。

我真的不想为此安装HAL,那么我该怎么做? 我的想法到目前为止:

  • (首选):使用DBus; 只需听取UDev事件而不是org.freedesktop.Hal 。 问题:我找不到相应的服务, org.freedesktop.UDisks似乎只能监视磁盘(duh)。 UDev是否发送其他设备的DBUS消息,如果没有,我可以configuration它这样做?
  • 使用UDev规则触发另一个脚本。 我喜欢将我的脚本放在一个地方,以便轻松过渡到新的操作系统安装,所以我宁愿避免这种情况。
  • 我最好使用Python直接听UDev ?
  • 或者我可以使用Perl来做到这一点? CPANsearch“udev”没有产生任何帮助。

或者我可能完全不在,UDev甚至不是我所需要的。 文档和Google都没有真正帮助过这个问题。 一个解决方法是,如果有人知道如何让GNOME3将audio输出切换到新连接的蓝牙耳机默认情况下,但我想学习脚本这样的东西。

提前感谢任何指针!
一个。

PS:顺便说一下,Google&Co。 声称UDev获取设备并向HAL发送消息,然后通知DBus。 那肯定不是这样,因为HAL甚至在Fedora Repos aymore中都没有。

你可以使用Udev :: FFI(cpanm Udev :: FFI)

例如:

 use Udev::FFI; my $udev = Udev::FFI->new() or die "Can't create udev context."; my $monitor = $udev->new_monitor() or die "Can't create udev monitor."; $monitor->filter_by_subsystem_devtype('usb', 'usb_device'); $monitor->start() or die "Can't start monitor."; for(;;) { if(defined(my $device = $monitor->poll())) { my $action = $device->get_action(); if($action eq 'add') { #work with $device ... 

不,udev不会自行发送D-Bus事件。 诸如Xorg,PuslseAudio和udisks等程序直接监视uevents(其中一些来自内核,另一些来自udev)。 对于许多事件来说,没有任何东西可以反映到D-Bus上。

udevadm monitor将打印出一串uevents。 这很容易在Perl中作为管道读取。 例如,

 open my $udev, '-|', qw(udevadm monitor); while (<$udev>) { my ($source, $ts, $action, $dev, $sys) = split; if ($action eq 'add') { # etc. 

然而,在大多数发行版上,蓝牙通过BlueZ处理,BlueZ提供了一个D-Bus接口。 例如,如果您对特定设备感兴趣,则可以在众所周知的系统总线名称org.bluez上监视/org/bluez/hciX/dev_XX_XX_XX_XX_XX_XX对象的org.bluez.Device1.Connected属性。

你检查了Device :: USB吗?

http://metacpan.org/pod/Device::USB

你可以用它来检查你的设备在一个循环中。

它包含开始的示例: https : //metacpan.org/pod/distribution/Device-USB/dump_usb.pl

问候,