gpt4 book ai didi

java - Java 上的条码扫描器实现

转载 作者:IT老高 更新时间:2023-10-28 20:32:25 26 4
gpt4 key购买 nike

好先生,我有一个问题。我目前正在从事的学校 Java 项目要求我将 USB 条形码扫描仪作为外部输入连接到我的笔记本电脑。我实际上并没有购买 USB 扫描仪,因为它对学生来说相当昂贵。所以我必须收集证据证明这个扫描仪可以和我的程序一起工作。

扫描仪能否读取条形码(可能是在线打印的)并将其存储到变量中?如果是这样,按下扫描仪的 Action 事件是否会像键盘按键一样被读取?如果是这样,代码行会是什么样子?

此外,如果您可以发布您使用条形码扫描仪的经验,或提供任何建议,例如购买哪种扫描仪,那将很有帮助。干杯!

最佳答案

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

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

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

但是很容易让这个模型直接与java交互,而不是使用键盘钩子(Hook)(在java中使用条形码作为变量,正如你提到的)。

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

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

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

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

此扫描仪确实需要用于串行端口仿真的驱动程序。我找到了实现说明和所需的驱动程序here (在“软件”选项卡下)。下载标题为“Honeywell Scanning and Mobility (HSM) USB Serial Driver”的软件包。标题为“HSM USB 串行驱动程序入门指南”的 PDF 有说明。

如果您不熟悉 javax.comm API。请阅读 this 中的介绍Rick Proctor 的示例 - 它告诉您在哪里获取 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);
}
};
}

关于java - Java 上的条码扫描器实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8146840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com