0

解决主要问题后,尝试从多个 HID 输入中读取数据,我在这里为以下(和不同的)问题打开了一个新问题:

我在RaspPi上安装了 minibian。整个系统运行在 上'de_DE',详细说明:

root@ddpi:~# locale
LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=

root@ddpi:~# grep -v ^# /etc/locale.gen
de_DE.UTF-8 UTF-8

还有pythonlocale.getdefaultlocale()'de_DE','utf-8'

没有 X 正在运行(因为它没有安装): ps -aux | grep X1297 0.0 0.1 4212 1828 pts/0 S+ 10:13 0:00 grep Xsystemctl get-defaultmulti-user.target.

但是存在以下问题:我连接了一个德语键盘,它在控制台中按预期写入德语,但被 evdev 识别为英语。我正在使用这些脚本,从 linux 中的 usb 键盘读取输入,并结合从多个设备读取事件,这些设备按预期工作,但语言除外。我的Y按键被识别为KEY_Z,我的Z按键被识别为 ,KEY_Y我的按键被识别ß为,KEY_MINUS以此类推。但到目前为止,我所看到的一切都设置为de_DE.

此脚本(仅限 evdev 部分)

from evdev import InputDevice, categorize, ecodes
dev = InputDevice('/dev/input/event0')

print(dev)
#device /dev/input/event1, name "Dell Dell USB Keyboard", phys "usb-0000:00:12.1-2/input0"

for event in dev.read_loop():
    if event.type == ecodes.EV_KEY:
        print(categorize(event))

key event at 1510568613.966220, 44 (KEY_Z), down
key event at 1510568614.039341, 44 (KEY_Z), up
key event at 1510568614.926334, 21 (KEY_Y), down
key event at 1510568614.998331, 21 (KEY_Y), up
key event at 1510568615.799577, 12 (KEY_MINUS), down
key event at 1510568615.863569, 12 (KEY_MINUS), up

用于yzß击键。

这里有什么问题?

4

1 回答 1

0

所以。根据我自己在这里创建德语键盘映射的建议是我的两个脚本,它们仍然是 DEV 版本,尚未投入生产,但可以在控制台输出上正常工作。我命名的第一个hidraw_survey.py是因为它一直想知道新的 HID 是否已连接或拔出。这两个事件都会导致pkill -f第二个脚本重新启动,该脚本read_hidraw_scanner.py一次处理所有连接的 HID 的键盘事件。因为有以下几点:

device /dev/input/event4, name "OPTO-E Barcode Device", phys "usb-3f980000.usb-1.5.4/input0"
device /dev/input/event0, name "CHICONY HP Basic USB Keyboard", phys "usb-3f980000.usb-1.5.1/input0"
device /dev/input/event1, name "Sycreader USB Reader", phys "usb-3f980000.usb-1.5.2/input0"
device /dev/input/event2, name "HID 04d9:1203", phys "usb-3f980000.usb-1.5.3/input0"
device /dev/input/event3, name "HID 04d9:1203", phys "usb-3f980000.usb-1.5.3/input1"

为什么数字键盘(列表中的最后一个)被计算两次......不知道,但输入事件被正确处理。

两个脚本都试图找出并猜测 0 到 9 之间的输入事件连接数,并跳过这些测试不成功的数字。语言特定的映射本身是由LANG = locale.getdefaultlocale()[0].split('_')[0].upper()which Deliver me实现的DE

第一个脚本hidraw_survey.py

import sys
import os
from pathlib import Path
import time


logfile = '/ddpos/log/hidraw_scanner.txt'

f = open(logfile, 'a')
f.write('hidraw_scanner started: '+time.strftime("%d.%m.%Y %H:%M:%S")+'\n')
f.close()

def try_kill_script(script):
    try:
        os.system('pkill -f '+script)
    except OSError:
        return False
    else:
        return True

old = ''
new = ''
while 1:
    out = ''
    for i in range(10):
        hidrawfile = '/dev/hidraw'+str(i)
        hidrawpath = Path(hidrawfile)
        if hidrawpath.exists():
            out += str(i)
            #print (out)
    new = out
    if new != old:
        print ('change registered')
        f = open(logfile, 'a')
        f.write('USB changed to: '+out+'\n')
        f.close()
        try_kill_script('read_hidraw_scanner.py')
        os.system('python3 /ddpos/test/read_hidraw_scanner.py &')
    old = out

第二个脚本read_hidraw_scanner.py

import os
import sys
from evdev import InputDevice, list_devices, ecodes, categorize
from select import select
from pathlib import Path
import locale

LANG = locale.getdefaultlocale()[0].split('_')[0].upper()

CODE_MAP_CHAR = {
    'DE': {
        'KEY_A': "a",
        'KEY_B': "b",
        'KEY_C': "c",
        'KEY_D': "d",
        'KEY_E': "e",
        'KEY_F': "f",
        'KEY_G': "g",
        'KEY_H': "h",
        'KEY_I': "i",
        'KEY_J': "j",
        'KEY_K': "k",
        'KEY_L': "l",
        'KEY_M': "m",
        'KEY_N': "n",
        'KEY_O': "o",
        'KEY_P': "p",
        'KEY_Q': "q",
        'KEY_R': "r",
        'KEY_S': "s",
        'KEY_T': "t",
        'KEY_U': "u",
        'KEY_V': "v",
        'KEY_W': "w",
        'KEY_X': "x",
        'KEY_Y': "z",
        'KEY_Z': "y",
        'SHIFT_KEY_A': "A",
        'SHIFT_KEY_B': "B",
        'SHIFT_KEY_C': "C",
        'SHIFT_KEY_D': "D",
        'SHIFT_KEY_E': "E",
        'SHIFT_KEY_F': "F",
        'SHIFT_KEY_G': "G",
        'SHIFT_KEY_H': "H",
        'SHIFT_KEY_I': "I",
        'SHIFT_KEY_J': "J",
        'SHIFT_KEY_K': "K",
        'SHIFT_KEY_L': "L",
        'SHIFT_KEY_M': "M",
        'SHIFT_KEY_N': "N",
        'SHIFT_KEY_O': "O",
        'SHIFT_KEY_P': "P",
        'SHIFT_KEY_Q': "Q",
        'SHIFT_KEY_R': "R",
        'SHIFT_KEY_S': "S",
        'SHIFT_KEY_T': "T",
        'SHIFT_KEY_U': "U",
        'SHIFT_KEY_V': "V",
        'SHIFT_KEY_W': "W",
        'SHIFT_KEY_X': "X",
        'SHIFT_KEY_Y': "Z",
        'SHIFT_KEY_Z': "Y",

        'SHIFT_KEY_GRAVE':'°',
        'SHIFT_KEY_1': "!",
        'SHIFT_KEY_2': "\"",
        'SHIFT_KEY_3': "§",
        'SHIFT_KEY_4': "$",
        'SHIFT_KEY_5': "%",
        'SHIFT_KEY_6': "&",
        'SHIFT_KEY_7': "/",
        'SHIFT_KEY_8': "(",
        'SHIFT_KEY_9': ")",
        'SHIFT_KEY_0': "=",
        'SHIFT_KEY_EQUAL': "`",
        'SHIFT_KEY_RIGHTBRACE':'*',
        'SHIFT_KEY_BACKSLASH':'\'',
        'SHIFT_KEY_COMMA':';',
        'SHIFT_KEY_DOT':':',
        'SHIFT_KEY_SLASH':'_',

        'ALTGR_KEY_Q': "@",
        'ALTGR_KEY_MINUS': "\\",
        'ALTGR_KEY_7': "{",
        'ALTGR_KEY_0': "}",
        'ALTGR_KEY_8': "[",
        'ALTGR_KEY_9': "]",
        'ALTGR_KEY_RIGHTBRACE':'~',

        'KEY_NUMERIC_STAR': "*",

        'KEY_GRAVE':'^',
        'KEY_LEFTBRACE':'Ü',
        'KEY_RIGHTBRACE':'+',
        'KEY_SEMICOLON':'Ö',
        'KEY_APOSTROPHE':'Ä',
        'KEY_BACKSLASH':'#',
        'KEY_102ND':'<',
        'KEY_COMMA':',',
        'KEY_DOT':'.',
        'KEY_SLASH':'-',
        'KEY_KPSLASH':'/',
        'KEY_KPASTERISK':'*',
        'KEY_KPMINUS':'-',
        'KEY_KPPLUS':'+',
        'KEY_KPDOT':'.',
        'KEY_SPACE': " ",
        'KEY_EQUAL': "´",
        'KEY_TAB': "\t",

        'KEY_MINUS': "ß",
        'KEY_SPACE': " ",

        'KEY_NUMERIC_1': "1",
        'KEY_NUMERIC_2': "2",
        'KEY_NUMERIC_3': "3",
        'KEY_NUMERIC_4': "4",
        'KEY_NUMERIC_5': "5",
        'KEY_NUMERIC_6': "6",
        'KEY_NUMERIC_7': "7",
        'KEY_NUMERIC_8': "8",
        'KEY_NUMERIC_9': "9",
        'KEY_NUMERIC_0': "0",
        'KEY_KP1': "1",
        'KEY_KP2': "2",
        'KEY_KP3': "3",
        'KEY_KP4': "4",
        'KEY_KP5': "5",
        'KEY_KP6': "6",
        'KEY_KP7': "7",
        'KEY_KP8': "8",
        'KEY_KP9': "9",
        'KEY_KP0': "0",
        'KEY_1': "1",
        'KEY_2': "2",
        'KEY_3': "3",
        'KEY_4': "4",
        'KEY_5': "5",
        'KEY_6': "6",
        'KEY_7': "7",
        'KEY_8': "8",
        'KEY_9': "9",
        'KEY_0': "0"
    },
     'EN': {
        'KEY_A': "A",
        'KEY_B': "B",
        'KEY_C': "C",
        'KEY_D': "D",
        'KEY_E': "E",
        'KEY_F': "F",
        'KEY_G': "G",
        'KEY_H': "H",
        'KEY_I': "I",
        'KEY_J': "J",
        'KEY_K': "K",
        'KEY_L': "L",
        'KEY_M': "M",
        'KEY_N': "N",
        'KEY_O': "O",
        'KEY_P': "P",
        'KEY_Q': "Q",
        'KEY_R': "R",
        'KEY_S': "S",
        'KEY_T': "T",
        'KEY_U': "U",
        'KEY_V': "V",
        'KEY_W': "W",
        'KEY_X': "X",
        'KEY_Y': "Y",
        'KEY_Z': "Z",
        'KEY_GRAVE':'`',
        'KEY_MINUS': "-",
        'KEY_SPACE': " ",  
        'KEY_BACKSLASH': "\\",
        'KEY_GRAVE': "`",
        'KEY_NUMERIC_STAR': "*",
        'KEY_LEFTBRACE': "[",
        'KEY_RIGHTBRACE': "]",    
        'KEY_COMMA': ",",
        'KEY_EQUAL': "=",    
        'KEY_SEMICOLON': ";",
        'KEY_APOSTROPHE': "'",
        'KEY_TAB': "\t",
        'KEY_DOT': ".",
        'KEY_SLASH': "/",
        'KEY_NUMERIC_1': "1",
        'KEY_NUMERIC_2': "2",
        'KEY_NUMERIC_3': "3",
        'KEY_NUMERIC_4': "4",
        'KEY_NUMERIC_5': "5",
        'KEY_NUMERIC_6': "6",
        'KEY_NUMERIC_7': "7",
        'KEY_NUMERIC_8': "8",
        'KEY_NUMERIC_9': "9",
        'KEY_NUMERIC_0': "0",
        'KEY_KP1': "1",
        'KEY_KP2': "2",
        'KEY_KP3': "3",
        'KEY_KP4': "4",
        'KEY_KP5': "5",
        'KEY_KP6': "6",
        'KEY_KP7': "7",
        'KEY_KP8': "8",
        'KEY_KP9': "9",
        'KEY_KP0': "0",
        'KEY_1': "1",
        'KEY_2': "2",
        'KEY_3': "3",
        'KEY_4': "4",
        'KEY_5': "5",
        'KEY_6': "6",
        'KEY_7': "7",
        'KEY_8': "8",
        'KEY_9': "9",
        'KEY_0': "0"
    }
}

def parse_key_to_char(val):
    return CODE_MAP_CHAR[LANG][val] if val in CODE_MAP_CHAR[LANG] else ""

def try_kill_script(script):
    try:
        os.system('pkill -f '+script)
    except OSError:
        return False
    else:
        return True

founddev = []
for i in range(10):
    trydev = '/dev/input/event'+str(i)
    if Path(trydev).exists():
        founddev.append(trydev)

devices = map(InputDevice, founddev)
devices = {dev.fd: dev for dev in devices}

for dev in devices.values():
    print(dev)

chars = ''
prefix = ''

while 1:

    r, w, x = select(devices, [], [])
    for fd in r:
        try:
            for event in devices[fd].read():
                if event.type == ecodes.EV_KEY:
                    e = categorize(event)
                    if e.keystate == e.key_down:
                        if e.keycode == 'KEY_LEFTSHIFT' or e.keycode == 'KEY_RIGHTSHIFT':
                            prefix = 'SHIFT_'
                        elif e.keycode == 'KEY_LEFTALT':
                            prefix = 'ALT_'
                        elif e.keycode == 'KEY_RIGHTALT':
                            prefix = 'ALTGR_'
                            print ('prefix='+prefix)
                        elif e.keycode == 'KEY_ESC':
                            chars = ''
                        elif e.keycode == 'KEY_BACKSPACE':
                            chars = chars[:-1]
                        elif e.keycode == 'KEY_ENTER' or e.keycode == 'KEY_KPENTER':
                            sys.stdout.write(chars+'\n')
                            sys.stdout.flush()
                            chars = ''
                        else:
                            #print (ecodes.EV_LED) # which outputs 17 forever
                            print (prefix + e.keycode)
                            chars += parse_key_to_char(prefix + e.keycode)
                    elif e.keystate == e.key_up:
                        #sys.stdout.write(parse_key_to_char(e.keycode))
                        #sys.stdout.flush()
                        #print ("'"+e.keycode+"':'"+parse_key_to_char(e.keycode)+"',")
                        if e.keycode == 'KEY_LEFTSHIFT' or e.keycode == 'KEY_RIGHTSHIFT':
                            prefix = ''
                        elif e.keycode == 'KEY_LEFTALT':
                            prefix = ''
                        elif e.keycode == 'KEY_RIGHTALT':
                            prefix = ''
        except:
            try_kill_script('read_hidraw_scanner.py')

这两个脚本都充满了像我这样的 python 新手制作的凹痕和皱纹,但我认为通过一些改进和简化,它是一个非常好的玩具,可以告诉 RaspPi 诸如配置设置或密码输入之类的东西(在我的情况下是条形码在条码不可读的情况下具有替代手动输入的扫描仪和用于餐厅服务员/服务员身份验证的 RFID 阅读器)

该映射涵盖了所有德语键盘键,包括 SHIFT 和 ALTGR(右 ALT),但还没有 ALT(左 ALT)。但它不适用于 è 或 é 或 ñ 等重音,也不适用于 CAPSLOCK。欢迎改进。

更新 目前的输出看起来像这样。依次是扫描的数字条码、字母数字条码、键盘输入和 RDFID 阅读器。

KEY_0
KEY_4
KEY_0
KEY_1
KEY_3
KEY_6
KEY_0
KEY_0
KEY_0
KEY_0
KEY_4
KEY_8
KEY_6
KEY_0
KEY_9
KEY_5
0401360000486095
KEY_2
SHIFT_KEY_B
KEY_5
KEY_6
KEY_6
KEY_9
SHIFT_KEY_C
SHIFT_KEY_F
KEY_4
SHIFT_KEY_A
KEY_2
KEY_1
SHIFT_KEY_C
KEY_1
SHIFT_KEY_B
KEY_7
2B5669CF4A21C1B7
KEY_M
KEY_Z
KEY_N
KEY_A
KEY_M
KEY_E
ALTGR_KEY_Q
KEY_E
KEY_M
KEY_A
KEY_I
KEY_L
KEY_DOT
KEY_C
KEY_O
KEY_M
myname@email.com
KEY_0
KEY_0
KEY_0
KEY_5
KEY_6
KEY_1
KEY_1
KEY_4
KEY_9
KEY_6
0005611496
于 2017-11-17T16:59:39.877 回答