如何在Python中区分读卡器和键盘?

时间:2013-04-13 23:44:21

标签: python cardreader

我有一个读卡器(MagTec MSR100),我想用它来读取磁卡的信息。当我插入读卡器时,计算机将读卡器解释为键盘,将相应的按键发送到我所在的任何应用程序(终端,vim等)的标准输入。我真正想做的是捕获特定于此设备而不是键盘的输出。

我已经读取了设备的权限(对我来说,/ dev / usb / hiddev0),当我尝试以下代码时

f = open('/dev/usb/hiddev0', 'r')
f.readline()

在Python中并刷卡,磁条中编码的信息(类似%6091430968014=FIRST/LAST?)就像我刚输入一样,并且对readline的调用不会返回。如何收听此特定设备的输入?

1 个答案:

答案 0 :(得分:0)

如果您使用的是Linux,请尝试使用Python模块evdev。

from evdev import InputDevice, categorize, ecodes

# Initialize card reader
swiper = InputDevice("/dev/input/event0") # magswipe card reader

scancodes = {
    # Scancode: ASCIICode
    0: None, 1: u'ESC', 2: u'1', 3: u'2', 4: u'3', 5: u'4', 6: u'5', 7: u'6', 8: u'7', 9: u'8',
    10: u'9', 11: u'0', 12: u'-', 13: u'=', 14: u'BKSP', 15: u'TAB', 16: u'Q', 17: u'W', 18: u'E', 19: u'R',
    20: u'T', 21: u'Y', 22: u'U', 23: u'I', 24: u'O', 25: u'P', 26: u'[', 27: u']', 28: u'CRLF', 29: u'LCTRL',
    30: u'A', 31: u'S', 32: u'D', 33: u'F', 34: u'G', 35: u'H', 36: u'J', 37: u'K', 38: u'L', 39: u';',
    40: u'"', 41: u'`', 42: u'LSHFT', 43: u'\\', 44: u'Z', 45: u'X', 46: u'C', 47: u'V', 48: u'B', 49: u'N',
    50: u'M', 51: u',', 52: u'.', 53: u'/', 54: u'RSHFT', 57: u' ', 100: u'?'
}

def read_card(lcd_line_1, lcd_line_2):
    while True:
        # listen to card swiper
        for event in swiper.read_loop():
            if event.type == ecodes.EV_KEY:
                data = categorize(event)  # Save the event temporarily to introspect it
                if data.keystate == 1:  # Down events only
                    key_lookup = scancodes.get(data.scancode) or u'UNKNOWN:{}'.format(data.scancode)  # Lookup or return UNKNOWN:XX
                    print(key_lookup)