最近,我不得不实现一个扫描系统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) myStrinBuilder.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);
}
};
}