扫码器.java_条码扫描器在Java上的实现

这篇博客介绍了如何在Java中实现与Honeywell Voyager MS9540 USB条码扫描器的交互,通过设置扫描仪模拟串行端口并使用javax.comm包读取数据。博主提供了一个简化版的ScanHandler类,该类实现了SerialPortEventListener,能够监听并处理扫描的数据,将其写入数据库或模拟键盘输入。
摘要由CSDN通过智能技术生成

我最近不得不实现一个扫描仪系统与java进行交互。

我使用了Honeywell Voyager MS9540 USB条码扫描器。

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

但是很容易让这个模型直接与java进行交互,而不是使用键盘钩子(如上所述在Java中使用条形码作为变量)。

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

我的java程序读取指定串行端口的所有输入,并将条形码写入数据库。我还设置程序将任何无法识别的条形码扫描传递到键盘(我的应用程序没有创建的任何条形码 – 我在我的条形码中使用了一个不同的签名),因此它可以作为常规条形码扫描器适用于任何其他应用程序从键盘读取条形码。

您可以通过执行一些密集的JNDI编码,直接从任何USB扫描仪读取数据(没有此模型的串行端口仿真),但是我并没有准备好花时间来解决本机代码。

要配置此特定型号的串行端口仿真,您所做的只是使用要配置的扫描仪扫描this文档中的特定条形码。它是“串行仿真模式”的条形码。

该扫描仪需要用于串行端口仿真的驱动程序。我发现了实现说明和所需的驱动程序here(在“软件”选项卡下)。下载“Honeywell扫描和移动(HSM)USB串行驱动程序”的软件包。有关“HSM USB串行驱动程序入门指南”的PDF文件的说明。

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

我确定有其他扫描仪型号有串行端口仿真(我不适用于霍尼韦尔)。

这是我的条形码阅读器类的一个有些削弱的版本:

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);

}

};

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值