我最近不得不实现一个扫描程序系统来与Java交互。

我使用了霍尼韦尔Voyager MS9540 USB条码扫描器。

默认情况下,扫描仪直接将数据作为键盘输入发送-不需要驱动程序。

但是,让此模型直接与Java 交互而不是使用键盘挂钩非常容易(如您所述,将条形码用作Java中的变量)。

该模型具有模拟串行端口的设置,然后可以使用javax.comm包读取扫描的数据。对我来说,这比获取键盘条形码的键盘挂钩要好得多,因为该程序在能够解释扫描之前不需要焦点(我不想创建全局键盘挂钩)。

我的Java程序从指定的串行端口读取所有输入,并将条形码写入数据库。我还设置了程序以将任何无法识别的条形码扫描传递到键盘(我的应用程序未创建的任何条形码-我在条形码上使用了独特的签名),因此它可以用作可能会出现的任何其他应用程序的常规条形码扫描仪从键盘读取条形码。

您可以通过进行一些密集的JNI编码来直接从任何USB扫描仪(无需该模型具有的串行端口仿真)中读取数据,但是我不准备花时间来编写本机代码。

要为串行仿真配置此特定模型,您要做的就是使用您要配置的扫描仪扫描本文档中的特定条形码。它是标题为“串行仿真模式”的条形码。

该扫描仪确实需要用于串行端口仿真的驱动程序。我在这里(“软件”标签下)找到了实施说明和所需的驱动程序。下载标题为“ Honeywell扫描和移动性(HSM)USB串行驱动程序”的软件包。标题为“ HSM USB串行驱动程序入门指南”的PDF附带了说明。

如果您不熟悉javax.comm API。请阅读Rick Proctor 在此示例中的介绍-它告诉您在哪里获取jar以及在哪里放置文件(大多数Java包都不标明javax.comm)。

我确定周围还有其他具有串行端口仿真功能的扫描仪型号(我不适用于Honeywell)。

这是我的条形码阅读器类的简化版本:

package scanhandler;

import java.awt.AWTException;

import java.awt.Robot;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.sql.Connection;

import java.util.Enumeration;

import java.util.Properties;

import java.util.TooManyListenersException;

import javax.comm.CommPortIdentifier;

import javax.comm.PortInUseException;

import javax.comm.SerialPort;

import javax.comm.SerialPortEvent;

import javax.comm.SerialPortEventListener;

import javax.comm.UnsupportedCommOperationException;

public class ScanHandler implements Runnable, SerialPortEventListener {

private static CommPortIdentifier   myCommPortIdentifier;

private static Enumeration          portList;

private static String               TimeStamp;

private static String               driverClass;

private static String               connectionString;

private static String               comPort;

private Connection                  myConnection;

private InputStream                 myInputStream;

private Robot                       myRobot;

private SerialPort                  mySerialPort;

private Thread                      myThread;

public ScanHandler() {

// open serial port

try {

TimeStamp = new java.util.Date().toString();

mySerialPort = (SerialPort) myCommPortIdentifier.open("ComControl", 2000);

//System.out.println(TimeStamp + ": " + myCommPortIdentifier.getName() + " opened for scanner input");

} catch (PortInUseException e) {

e.printStackTrace();

}

// get serial input stream

try {

myInputStream = mySerialPort.getInputStream();

} catch (IOException e) {

e.printStackTrace();

}

// add an event listener on the port

try {

mySerialPort.addEventListener(this);

} catch (TooManyListenersException e) {

e.printStackTrace();

}

mySerialPort.notifyOnDataAvailable(true);

// set up the serial port properties

try {

mySerialPort.setSerialPortParams(9600,

SerialPort.DATABITS_8,

SerialPort.STOPBITS_1,

SerialPort.PARITY_NONE);

mySerialPort.setDTR(false);

mySerialPort.setRTS(false);

} catch (UnsupportedCommOperationException e) {

e.printStackTrace();

}

// make a robot to pass keyboard data

try {

myRobot = new Robot();

} catch (AWTException e) {

e.printStackTrace();

}

// create the thread

myThread = new Thread(this);

myThread.start();

}

public void run() {

try {

Thread.sleep(100);

} catch (InterruptedException e) {}

}

// on scan

public void serialEvent(SerialPortEvent event) {

if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {

StringBuilder myStringBuilder = new StringBuilder();

int c;

try {

// append the scanned data onto a string builder

while ((c = myInputStream.read()) != 10){

if (c != 13)  myStringBuilder.append((char) c);

}

// send to keyboard buffer if it the barcode doesn't start with '5'

if (myStringBuilder.charAt(0) != '5') {

for (int i = 0; i < myStringBuilder.length(); i++) {

myRobot.keyPress((int) myStringBuilder.charAt(i));

myRobot.keyRelease((int) myStringBuilder.charAt(i));

}

// here's the scanned barcode as a variable!

} else {

TimeStamp = new java.util.Date().toString();

System.out.println(TimeStamp + ": scanned input received:" + myStringBuilder.toString());

}

// close the input stream

myInputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

// read ScanHandler properties

Properties myProperties = new Properties();

try {

myProperties.load(new FileInputStream("config.properties"));

comPort             = myProperties.getProperty("ScanHandler.comPort");

} catch (IOException e) {

e.printStackTrace();

}

try {

// get our pre-defined COM port

myCommPortIdentifier = CommPortIdentifier.getPortIdentifier(comPort);

ScanHandler reader = new ScanHandler();

} catch (Exception e) {

TimeStamp = new java.util.Date().toString();

System.out.println(TimeStamp + ": " + comPort + " " + myCommPortIdentifier);

System.out.println(TimeStamp + ": msg1 - " + e);

}

};

}

java条码扫描_Java上的条形码扫描仪实现相关推荐

  1. java条码大小_java - ML Kit条形码扫描:无效的图像数据大小

    我想在捕获的图像中检测条形码.我使用android的camera2捕获图像.此后,将检索图像的元数据并将图像保存到设备.元数据全部传递到下一个活动,该活动是应用程序尝试检测条形码的地方. 下一个活动是 ...

  2. java条码扫描_【教程】条形码组件Spire.Barcode 教程:在Java中扫描条形码

    Spire.Barcode for Java支持生成各种类型的条码,如Code 128,Pdf 417,QR码等.同时,它还支持从生成的条码图像中读取数据. 本文演示如何使用Spire.Barcode ...

  3. java条码扫描_javaweb条形码产生、打印、扫描

    产生条形码的插件到是不少,可是能用针式打印机打印在合适表单上,并且能用经常使用的激光扫描器扫描出来的demo到不是非常多. 本文,所牵扯的代码与工具均亲測可用. 使用工具: epson  LQ-630 ...

  4. java条码大小_java – 自定义条形码输入中缺少条形码高度

    我正在整合FedEx运输API以使用 Java生成标签.一切都很好,但除了这个问题.在为FedEx Freight设置LabelFormatType到COMMON2D或LABEL_DATA_ONLY时 ...

  5. java条码扫描_用Java处理条形码扫描

    我遇到了一个像您一样的问题,并创建了一个项目(目前存在一些问题的概念证明),以简化条码的摆放操作. 它基于以下事实:条形码读取器模仿键盘,但与它们以恒定的时间"打字"的人不同.基本 ...

  6. java条码查商品信息_条形码商品管理信息系统SQL JAVA源码大小11M

    条形码商品管理信息系统SQL JAVA源码大小11M 源码下载地址: (精品源码有详细软件界面截图) 本站提供几百套大型商业源码,平均一元一套,火爆下载中...... QQ:283072.283672 ...

  7. java fileupload 进度_Java上传文件进度条的实现方法(附demo源码下载)

    本文实例讲述了Java上传文件进度条的实现方法.分享给大家供大家参考,具体如下: 东西很简单,主要用到commons-fileupload,其中有一个progressListener的接口,该接口可以 ...

  8. java条码大小_java – 如何设置iText条码宽度?

    我需要设置iText生成的条形码宽度.我正在使用此代码: Barcode128 code128 = new Barcode128(); code128.setCode("P662130002 ...

  9. java 端口扫描_java端口扫描(原创)

    项目需要扫描占用的端口来判断服务是否启动,通过查资料发现大多数方法都是ServerSocket socket = new ServerSocket(port);代码如下: package com.fr ...

最新文章

  1. 【高级数据结构】并查集
  2. 最强干货实践教程 | YOLOv5在建筑工地中安全帽佩戴检测的应用
  3. 实战Gradle——第1章 项目自动化介绍
  4. 小块头大性能才能得到用户的青睐
  5. vivo应用商店电脑版_好车网APP|苹果商城、华为应用市场、腾讯应用宝、vivo应用商店、OPPO应用商店用户免费下载...
  6. Html轻松使用拖拽实现垃圾桶,代码带注释,包你能看懂
  7. ASP.NET分页方法的了解程度
  8. python写的程序怎么打包成exe_python--- 如何将自己的程序打包成exe ?
  9. 数据库—事务—并发控制技术
  10. 手把手教会使用YOLOv5训练VOC2007数据集
  11. 【植被指数学习笔记】
  12. ppt压缩文件怎么压缩?
  13. matlab全桥电路设计,全桥变换电路的Matlab仿真及实验装置开发.pdf
  14. Linux云计算学习教程,一个全新的世界—Linux
  15. 搭建多节点Linux环境
  16. Springboot+axios+vue使用VerifyCodeUtils工具类实现验证码图片功能
  17. 【数学建模】6 近十年江西省研究生建模赛题及近三年全国建模赛题目录
  18. VGG16-好莱坞明星识别
  19. 【计算机网络】TCP为什么需要4次挥手
  20. 大二之前此博客不会有太多的更新

热门文章

  1. Ubuntu20.04如何新建.txt文件
  2. wx-wx-wx-wx-wx-wx-wx-wx-wx-wx-wx
  3. EmWin学习课堂_小白EmWin_EmWin快速入门_EmWin用Button控件显示文本
  4. 2018工作--武汉篇
  5. 设计模式(十)----策略模式
  6. 大学生上网应“慎独”
  7. SSL/TLS 双向认证
  8. 谷歌浏览器批量下载数据,以批量下载modis数据为例
  9. 直流无刷风扇引脚说明
  10. 【物联网硬件安全】二、固件分析-固件提取