Python evdev和条形码扫描仪
我有一个下面的代码,我用它来捕捉条形码扫描仪的输入。问题在于我想将整个扫描的代码保存在数据库中,但代码的每个字符都打印在新行上:Python evdev和条形码扫描仪,python,barcode,barcode-scanner,evdev,Python,Barcode,Barcode Scanner,Evdev,我有一个下面的代码,我用它来捕捉条形码扫描仪的输入。问题在于我想将整个扫描的代码保存在数据库中,但代码的每个字符都打印在新行上: #!/usr/bin/env python from evdev import InputDevice, ecodes, list_devices from select import select keys = "X^1234567890XXXXqwertzuiopXXXXasdfghjklXXXXXyxcvbnmXXXXXXXXXXXXXXXXXXXXXXX"
#!/usr/bin/env python
from evdev import InputDevice, ecodes, list_devices
from select import select
keys = "X^1234567890XXXXqwertzuiopXXXXasdfghjklXXXXXyxcvbnmXXXXXXXXXXXXXXXXXXXXXXX"
dev = InputDevice("/dev/input/event10")
barcode = ""
while True:
r,w,x = select([dev], [], [])
for event in dev.read():
if event.type == 1 and event.value == 1:
barcode += (keys[event.code])
print barcode
# sudo ./bar-code-test.py
#0
#00
#00
#000
#001
#1001
#0017
#70017
#00170
#000170
#001708
#8001708
#0017085
#50017085
#00170853
#300170853
#001708531
#1001708531
#0017085316
#60017085316
#00170853160
#000170853160
#001708531601
#1001708531601
#0017085316013
#30017085316013
#00170853160131
#100170853160131
#00170853160131X
#00170853160131X
我是python的新手,因此任何帮助都将不胜感激。找到了解决方案。条形码扫描仪每次扫描后发送42个扫描码输入键,所以我们需要检查扫描码:
#!/usr/bin/env python
from evdev import InputDevice, ecodes, list_devices, categorize
import signal, sys
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', 56: u'LALT', 100: u'RALT'
}
barCodeDeviceString = "Metrologic Metrologic Scanner"
devices = map(InputDevice, list_devices())
for device in devices:
if device.name == barCodeDeviceString:
dev = InputDevice(device.fn)
def signal_handler(signal, frame):
print 'Stopping'
dev.ungrab()
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
dev.grab()
barcode = ""
for event in dev.read_loop():
if event.type == ecodes.EV_KEY:
data = categorize(event)
if data.keystate == 1 and data.scancode != 42: # Catch only keydown, and not Enter
if data.scancode == 28:
print barcode
barcode = ""
else:
barcode += keys[data.scancode]
如果您读取字符串的长度,直到它达到所需的值或长度,您将退出循环并打印出读取的条形码 我这样修改了代码,它只打印了一行:
#!/usr/bin/env python
from evdev import InputDevice, ecodes, list_devices
from select import select
keys = "X^1234567890XXXXqwertzuiopXXXXasdfghjklXXXXXyxcvbnmXXXXXXXXXXXXXXXXXXXXXXX"
dev = InputDevice("/dev/input/event1")
barcode = ""
while True:
r,w,x = select([dev], [], [])
for event in dev.read():
if event.type == 1 and event.value == 1:
barcode += (keys[event.code])
if (len (barcode)) > 13:
break;
print barcode
我用OpenWrt在Arduino-Yun中试用过,效果很好:
root@Arduino:/mnt/sda1# python pybar.py
7501483187071X
如果我想触发一个事件,例如在触发打印条形码后或data.scancode==28时调用REST api,该怎么办?并防止在执行事件时记录后续扫描。如何实现?我已尝试解除设备锁定,但它似乎没有退出dev.read_loop@user1872384我认为您需要某种标志,它将指示条形码已被处理。例如,将某个变量设置为True并在循环中检查该变量。如果为真,则循环将继续,即使出现新事件,例如扫描新条形码。一旦条形码处理完毕,REST API返回了一些设置,将其标记回False,以便进一步扫描条形码。谢谢@bosha。我尝试在循环中放置一个标志。然而,它似乎没有生效。标志设置为true后,它仍将进入for循环。我想要一些东西来完全停止扫描事件。@user1872384我认为你做错了什么。请分享相关代码部分。我想到了一些事情-