5

我想在每次连接时使用一个简单的 Perl 脚本进行一些配置,例如我的蓝牙耳机。我尝试使用Net::DBus,但我的 OS/DE(Fedora 17、GNOME3)不再使用 HAL。

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

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

或者我可能完全关闭,UDev 甚至不是我需要的。文档和谷歌在这件事上都没有真正的帮助。一种解决方法是,如果有人知道如何让 GNOME3 默认将音频输出切换到新连接的蓝牙耳机,但我还是想学习这样的脚本。

提前感谢您的任何指点!
一个。

PS:顺便说一下,Google&Co。声称 UDev 获取设备并向 HAL 发送消息,HAL 反过来通知 DBus。绝对不是这种情况,因为 HAL 甚至不再出现在 Fedora Repos 中。

4

3 回答 3

1

您可以使用 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
...
于 2017-07-13T11:33:11.957 回答
0

不,udev 不会自行发送 D-Bus 事件。Xorg、PuslseAudio、udisks等程序直接监听uevents(有些来自内核,有些是udev生成的)。对于许多 uevent 来说,没有任何东西可以将它们反映到 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.Device1.Connected属性。/org/bluez/hciX/dev_XX_XX_XX_XX_XX_XXorg.bluez

于 2017-09-11T07:34:44.973 回答
-1

你检查过 Device::USB 吗?

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

您可以使用它循环检查您的设备。

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

问候,

于 2013-02-28T16:40:40.300 回答