Java在后台获取USB二维码扫描枪扫描的内容

简介: 在Java Web项目中集成扫描枪,首先发现扫描枪可模拟键盘输入,聚焦窗口即接收数据。通过官网电话得知有串口编程支持,但项目无串口,故搜索Java串口解决方案。找到开源项目,理解其工作原理。使用Java Native Access (JNA)来监听操作系统输入,解决Java JVM无法直接获取键盘输入的问题。遇到jar包缺失问题,最终在国内仓库mvnjar.com找到合适版本运行成功。实现时需注意处理字母大小写和特殊字符输入。

项目需要在Web项目中获取扫描枪扫描的内容,项目是Java Web项目。

拿到扫描枪后,连接在自己的Windows系统上试了下,插上后,不需要装任何驱动,只要有个文本框,就能将扫描到的内容输入到文本框里。反复测试后发现,当前窗口的焦点在哪里,扫描到的内容就显示在哪里。

先按照盒子上的厂家名称找到官网,在官网上查到了技术支持电话,说他们有串口类型的扫描枪,可支持软件编程。挂完电话看了下我们的上位机,是没有串口的,只有USB接口。但是网上搜了一下,有用Java扫描系统的串口,然后根据串口号获得串口输入进来的东西。

然后就以Java 扫描枪为关键字搜索相关资料,以前还真有人做过这个,在开源中国找到一个前辈做的项目,是一个条形码扫描枪,人家实现了。代码那过来研究了一番,大致明白了。

扫描仪其实说白了对电脑来说就是个键盘, 扫描枪将扫描得到的内容解析,然后模拟键盘,一个一个敲入到电脑中,最后按一下回车键!怪不得焦点在哪个窗口就输入到哪个窗口呢。

那就又遇到一个问题,Java代码运行在Jvm虚拟机内,扫描枪或键盘输入的东西,只有操作系统知道,Jvm虚拟机如何知道呢?那就是JNI编程,通过写C/C++代码,监听操作系统的的输入流,然后通过JNI调用。虽然我不会JNI,也不会C/C++,

但幸运的是,SUN公司已经实现了这个代码,弄出一个叫JNA的东西(Java Native Access),给Java提供了访问操作系统键盘鼠标的能力。

然后将人家的代码完整拷贝,想跑一下,结果没jar包,一直报错,根据包名百度,在maven仓库中找相关jar包,(想找官方的jar包和一些文档,无奈,因为被收购的原因,有些链接已经挂了,找不到哇)找到几个,放进去,编译不报错了,运行一直报错,换了好几个jar包,还是不行,真是可郁闷了。

最后在一个国内的仓库网站找到一个清晰的分类,下载里面的大分类下面的一组jar包,运行成功了。网址是www.mvnjar.com

当自己要实现字母键的时候,才发现,字母不是那么好实现的,因为有大小写区分,还有!@#$%^这些字符需要按住shift键输入。JNA提供的钩子函数,我们能拿到的只有键盘的键控代码,当时感觉很麻烦,想想头都大了。

注意,因为二维码扫描枪只能输入大小写字母、数字、特殊字符,所以其他的键我没管,类似于Ctrl、FN、Alt、F快捷键等。

运行需要的jar包在仓库下,网址是:https://www.mvnjar.com/net.java.dev.jna/list.html,下载jna-5.2.0.jar和jna-platform-5.2.0.jar
这两个就可以。

相关文章
|
5天前
|
数据采集 存储 Java
高德地图爬虫实践:Java多线程并发处理策略
高德地图爬虫实践:Java多线程并发处理策略
|
3天前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
1天前
|
消息中间件 监控 安全
【JAVAEE学习】探究Java中多线程的使用和重点及考点
【JAVAEE学习】探究Java中多线程的使用和重点及考点
|
1天前
|
安全 Java 开发者
构建高效微服务架构:后端开发的新范式Java中的多线程并发编程实践
【4月更文挑战第29天】在数字化转型的浪潮中,微服务架构已成为软件开发的一大趋势。它通过解耦复杂系统、提升可伸缩性和促进敏捷开发来满足现代企业不断变化的业务需求。本文将深入探讨微服务的核心概念、设计原则以及如何利用最新的后端技术栈构建和部署高效的微服务架构。我们将分析微服务带来的挑战,包括服务治理、数据一致性和网络延迟问题,并讨论相应的解决方案。通过实际案例分析和最佳实践的分享,旨在为后端开发者提供一套实施微服务的全面指导。 【4月更文挑战第29天】在现代软件开发中,多线程技术是提高程序性能和响应能力的重要手段。本文通过介绍Java语言的多线程机制,探讨了如何有效地实现线程同步和通信,以及如
|
4天前
|
安全 Java
【JAVA】线程的run()和start()有什么区别?
【JAVA】线程的run()和start()有什么区别?
|
4天前
|
缓存 Java
Java并发编程:深入理解线程池
【4月更文挑战第26天】在Java中,线程池是一种重要的并发工具,它可以有效地管理和控制线程的执行。本文将深入探讨线程池的工作原理,以及如何使用Java的Executor框架来创建和管理线程池。我们将看到线程池如何提高性能,减少资源消耗,并提供更好的线程管理。
|
5天前
|
Java UED
Java并发编程:理解并应用线程池
【4月更文挑战第25天】在处理并发问题时,线程池是Java中一种重要的工具。本文将探讨线程池的概念、优势以及如何在Java程序中有效地使用它。我们将详细解释线程池的工作原理,并通过示例来使其更加易于理解。
|
5天前
|
监控 Java 调度
Java多线程实战-从零手搓一个简易线程池(四)线程池生命周期状态流转实现
Java多线程实战-从零手搓一个简易线程池(四)线程池生命周期状态流转实现
|
5天前
|
设计模式 Java
Java多线程实战-从零手搓一个简易线程池(三)线程工厂,核心线程与非核心线程逻辑实现
Java多线程实战-从零手搓一个简易线程池(三)线程工厂,核心线程与非核心线程逻辑实现
|
5天前
|
Java 测试技术
Java多线程实战-从零手搓一个简易线程池(二)线程池实现与拒绝策略接口定义
Java多线程实战-从零手搓一个简易线程池(二)线程池实现与拒绝策略接口定义