树莓派接新大陆扫码枪

反射涟漪
• 阅读 5333

平时用的最多的扫描枪通常只是一个简单的输入设备(好比键盘,鼠标), 另一头需要连接电脑, 用的 usb 或者串口. 扫描枪负责识别条码, 电脑收到后执行业务的逻辑. 有时候只是简单的数据采集工作, 数据传到服务器云端;

用到的设备

带 USB 接收器的无线扫码请条码扫描枪(本案例以新大陆OY26-RF无线扫描枪为例)
树莓派接新大陆扫码枪
树莓派接新大陆扫码枪
树莓派 4b
树莓派接新大陆扫码枪

我们将用到 python-evdev 程序库, 封装了对 usb 设备的读写操作. 官网 https://python-evdev.readthedocs.io/
安装 evdev
sudo pip install evdev
检测设备

将扫码枪的无线接收器插入树莓派的USB口,在树莓派上新建python文件,拷贝下方代码并执行,检测设备能否发现

#!/usr/bin/python3
 
import evdev
 
# 列出 usb 设备
devices = [evdev.InputDevice(path) for path in evdev.list_devices()]
 
print('发现设备: ')
for device in devices:
  print(device.path, device.name, device.phys)

执行结果如下表示发现设备:

/dev/input/event0 Netum. HIDKB usb-0000:01:00.0-1.3/input0
修改扫码枪配置,增加结束符后缀
扫码枪接入设备后,默认是以键盘的方式接入,读取二维码时,是以一个字符一个字符的方式逐个读取的,默认扫码不增加结束符后缀,程序无法确认是否扫码结束,需要增加结束符来区分

树莓派接新大陆扫码枪

使用扫码枪,扫瞄下方的条码(一次不行的话可以扫描多次),增加TAB结束符;
树莓派接新大陆扫码枪

根据查找到的扫码枪设备信息,调用扫码
import evdev
import time
import findScanGun
from evdev import InputDevice, categorize, ecodes


class ScanGun:
    dev = findScanGun.find()
    device = InputDevice(dev) # my keyboard
    scancodes = {
        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', 57: u' ', 100: u'RALT'
    }

    capscodes = {
        0: None, 1: u'ESC', 2: u'!', 3: u'@', 4: u'#', 5: u'$', 6: u'%', 7: u'^', 8: u'&', 9: u'*',
        10: u'(', 11: u')', 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',  57: u' ', 100: u'RALT'
    }
    #是否大小写,默认小写
    caps = False
    #setup vars
    x = ''

    # grab 是为了独占,保证此设备不会被别的进程捕获
    device.grab()
    def run(self):
        start = time.time()
        for event in self.device.read_loop():
            if event.type == ecodes.EV_KEY:
                data = categorize(event)  # Save the event temporarily to introspect it
                # 判断按键是不是SHIFT,如果是SHIFT按住的,需要大写锁定,如果事件是松开的那就解除大写锁定
                if data.scancode == 42:
                    if data.keystate == 1:
                        caps = True
                    if data.keystate == 0:
                        caps = False
                if data.keystate == 1:
                    # 判断SHIFT键是不是按住的,如果是按住的就读取大写字母
                    if self.caps:
                        key_lookup =self.capscodes.get(data.scancode)
                    else:
                        key_lookup = self.scancodes.get(data.scancode)
                    # SHFT,CTRL,TAB属于特殊按键,不计算在扫码内容结果中
                    if (data.scancode != 42) and (data.scancode != 28) and (data.scancode != 15):
                        self.x += key_lookup  
                    if(data.scancode == 15):
                        print("识别结束:",time.time()-start)  
                        # 解除设备独占,关闭设备
                        self.device.ungrab()  
                        self.device.close()      # Print it all out!
                        return self.x;
scangun = ScanGun()
list= scangun.run()


print(list)
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
UIWebView长按保存图片和识别图片二维码的实现方案(使用缓存)
0x00需求:长按识别UIWebView中的二维码,如下图长按识别二维码0x01方案1:给UIWebView增加一个长按手势,激活长按手势时获取当前UIWebView的截图,分析是否包含二维码。核心代码:略优点:流程简单,可以快速实现。不足:无法实现保存UIWebView中图片,如果当前We
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Linux应急响应(二):捕捉短连接
0x00前言​短连接(shortconnnection)是相对于长连接而言的概念,指的是在数据传送过程中,只在需要发送数据时,才去建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。在系统维护中,一般很难去察觉,需要借助网络安全设备或者抓包分析,才能够去发现。0x01应急场景​
解决云电脑无法使用本地终端连接的USB设备
在使用云电脑时,我们通常会将本地终端(如个人电脑、笔记本电脑等)与云端的虚拟机进行连接。通过这种连接方式,我们可以在本地终端上使用云端虚拟机的计算资源。然而,有时候我们可能会遇到无法使用本地终端连接的USB设备的问题。具体表现为无法在云端虚拟机中识别和使用本地终端连接的USB设备。
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这