条码扫描器在 Java 上的实现 [英] Barcode Scanner implementation on Java

查看:25
本文介绍了条码扫描器在 Java 上的实现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Good sirs, I have a question. The school Java project I am currently working on requires me to have a USB Barcode Scanner as an external input to be connected to my laptop. I haven't actually bought the USB Scanner since it's quite expensive for a student. So I have to gather evidence that this Scanner would work with my program.

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

Would the Scanner be able to read from a barcode (presumably printed off online) and store it into a variable? If so, is it true that the action event for the press of the scanner would be read exactly like a keyboard keypress? If so, what would the line of code look like?

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

Also, if you could post your experiences with Barcode Scanners, or give any advice, such as which Scanner to buy, that would help alot. Cheers!

推荐答案

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

I recently had to implement a scanner system to interact with java.

我使用了 Honeywell Voyager MS9540 USB 条码扫描仪.

I used Honeywell Voyager MS9540 USB barcode scanner.

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

As a default the scanner sent the data straight as keyboard input - no driver required.

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

But it was very easy to get this model to interact directly with java rather than using a keyboard hook (to use the barcodes as variables in java, as you mentioned).

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

This model has a setting to emulate a serial port, you can then read the scanned data using the javax.comm package. For me, this was much better than a keyboard hook to get the barcode data because the program does not need the focus before being able to interpret a scan (I would not want to create a global keyboard hook).

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

My java program reads all input from the specified serial port and writes the barcode to a database. I also setup the program to pass any unrecognized barcode scans to the keyboard (any barcode that my app did not create - I used a distinct signature on my barcodes) this was so it would work as a regular barcode scanner for any other apps that might read barcodes from the keyboard.

通过执行一些密集的 JNI 编码,您可能可以直接从任何 USB 扫描仪(没有该模型具有的串行端口仿真)读取数据,但我没有准备好花时间计算本机代码.

You could probably read data directly from any USB scanner (without the serial port emulation that this model has) by doing some intensive JNI coding but I wasn't prepared to take the time to work out the native code.

要为串行端口仿真配置此特定模型,您只需扫描 文档以及您要配置的扫描仪.它是标题为串行仿真模式"的条形码.

To configure this particular model for serial port emulation all you do is scan a specific barcode in this document with the scanner you want to configure. It is the barcode titled "Serial Emulation Mode".

此扫描仪确实需要用于串行端口仿真的驱动程序.我找到了实施说明和所需的驱动程序 此处(在软件"标签下).下载标题为Honeywell Scanning and Mobility (HSM) USB Serial Driver"的软件包.标题为HSM USB 串行驱动程序入门指南"的 PDF 中有说明.

This scanner does require a driver for serial port emulation. I found the implementation instructions and the needed drivers here (under the "software" tab). Download the package titled: "Honeywell Scanning and Mobility (HSM) USB Serial Driver". The PDF titled "HSM USB Serial Driver Getting Started Guide" had the instructions.

如果您不熟悉 javax.comm API.请阅读 Rick Proctor 的 this 示例中的介绍 - 它告诉你从哪里得到 jar 以及把文件放在哪里(javax.comm 不是大多数 java 包的标准).

If you are not familiar with the javax.comm API. Please read the intro in this example by Rick Proctor - it tells you where to get the jar and where to put the files (javax.comm does not come standard with most java packages).

我确定周围还有其他具有串行端口仿真功能的扫描仪型号(我不在霍尼韦尔工作).

I'm sure there are other scanner models around that have serial port emulation (I don't work for Honeywell).

这是我的条码阅读器类的精简版:

Here's a somewhat stripped down version of my barcode reader class:

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 上的实现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆