【问题标题】:Alternative approaches for accessing keyboard LEDs in Linux with Python使用 Python 在 Linux 中访问键盘 LED 的替代方法
【发布时间】:2013-03-26 06:24:48
【问题描述】:

我在 Linux 中创建了一个 Python 程序,它会闪烁 NumLock LED。代码如下:

import fcntl
import os
import time

# Define variables for keyboard and NUM_LOCK LED
KDSETLED = 0x4B32
NUM_LED = 0x02

# Open the "keyboard console" for LED toggling
console_fd = os.open('/dev/console', os.O_NOCTTY)

def blink(tme, cnt):
    secs = tme/cnt
    for i in range(cnt):
        fcntl.ioctl(console_fd, KDSETLED, 0)
        time.sleep(secs)
        fcntl.ioctl(console_fd, KDSETLED, NUM_LED)
        if i < cnt - 1:
            time.sleep(secs)

blink(0.5,1)

如果它看起来有点眼熟,那是因为它来自类似的帖子here

对于我的一个 Power Up,它会正确闪烁! USB 数字键盘(部件号:G54-41403)。然而,虽然程序运行没有任何错误,但我的旧键盘的 LED 不闪烁(我还验证了 NUM LOCK 是否正确)。较旧的键盘是带有 USB 集线器的 Targus 数字键盘(型号 PAUK10U 请注意,我无法在网上找到我的旧型号)和 Rlip 人体工学键盘 KNP-180

我查看了Python模块python-keyboardleds(链接here),发现程序直接访问键盘。具体来说,当我通过/dev/console 访问它时,程序通过/dev/input/by-path/ 访问它。我尝试更改代码,以便打开列表中的第一个键盘,结果与以前相同(没有错误,其他键盘型号上的 LED 没有闪烁)。我制作的代码如下所示:

#LEDToggle.py

import argparse
import glob
import grp
import os
import pwd
import re
import subprocess
import time
import fcntl
import keyboardleds

def drop_privileges():
    uid = pwd.getpwnam('nobody').pw_uid
    gid = grp.getgrnam('nogroup').gr_gid
    os.setgid(gid)
    os.setuid(uid)

def parse_args():
    led_names = list(t + '-lock' for t in ('caps', 'num', 'scroll'))
    ap = argparse.ArgumentParser()
    ap.add_argument('--led', choices=led_names, default=led_names[1],
    help='keyboard LED to use',
    )
    return ap.parse_args()

def blink(tme, cnt):
    secs = tme/cnt
    options = parse_args()
    event_device = glob.glob('/dev/input/by-path/*-event-kbd')[0]
    ledkit = keyboardleds.LedKit(event_device)
    drop_privileges()
    #led = getattr(ledkit, 'num-lock')
    led = getattr(ledkit, options.led.replace('-', '_'))
    for i in range(cnt):
        led.reset()
        print "off"
        time.sleep(secs)
        led.set()
        print "on"
        if i < cnt - 1:
            time.sleep(secs)

blink(5,5)

经过研究,我怀疑访问/dev/console时某些键盘没有被正确调用。当我查看/dev/input/by-path/ 时,我发现工作键盘被命名为platform-bcm2708_usb-usb-0:1.3:1.0-event-kbd。然后,当我尝试连接两个非工作键盘之一时,它们具有相同的名称。

我还尝试在内核中使用setleds 命令,以及调用控制台和tty7 与键盘进行通信。两者都做了同样的事情。他们在 Power Up 上工作!键盘和(没有任何错误)在其他两个键盘上没有闪烁。

我觉得我无法与这些旧键盘正确通信。除了我尝试过的以外,还有其他方法可以切换键盘 LED 吗?

【问题讨论】:

  • 您是否在上周使用不同的用户名问过同样的问题?如果没有,其他人肯定做到了,所以搜索一下。 (虽然 IIRC,它从来没有得到回答,因为我建议 OP 看看 python-keyboardleds,他说他会这样做,稍后再回来。)
  • @abarnert 这是上周发布此问题的同一用户。诚然,我对使用它很陌生,但我觉得我上周提出的上一个问题与原来的问题相比发生了很大变化,重新提出修改后的问题会使问题更加清晰。我不是故意试图违反任何规则,或在此过程中惹恼任何人
  • @abarnert 我确实尝试过使用python-keyboardleds 模块,结果是一样的。
  • 问一个新问题很好,但通常值得链接到前一个问题,如果没有其他原因,只是为了阻止某人关闭你的新问题。此外,使用一个帐户可能比为每个问题创建一个新帐户更好,如果没有其他原因,只是获得名义上的 5 个代表或获得基本功能所需的任何其他原因。
  • @abarnert 很高兴知道。下次我会记住这个建议。我实际上使用的帐户与以前相同。我不知道为什么它会改变我。不管怎样,谢谢你的建议。但回到主题,是否有另一种方法可以访问键盘上的 LED?

标签: python linux keyboard


【解决方案1】:

如果setleds 不起作用,很可能问题在于您的两个旧键盘没有可通过编程访问的 LED,或者,如果有,则无法通过 linux 控制台驱动程序访问它们。

这些是键盘,旨在与全键盘(通常已经有自己的 LED)一起使用,这一事实可能使这看起来是一个合理的设计决定。

除非您想尝试直接在 USB 级别与键盘进行通信,否则我认为您已经完成了。

【讨论】:

  • 我认为情况会如此,但至少有一个很好的理论来支持这个想法。谢谢
猜你喜欢
  • 2022-07-12
  • 2012-04-29
  • 1970-01-01
  • 2021-04-29
  • 2021-10-29
  • 1970-01-01
  • 2013-06-24
  • 2018-03-01
  • 2013-02-11
相关资源
最近更新 更多