Подтвердить что ты не робот

Реализация сканера штрих-кода на Java

Добрые господа, у меня есть вопрос. В школьном проекте Java, над которым я сейчас работаю, требуется, чтобы у меня был USB-сканер штрих-кода в качестве внешнего входа для подключения к моему ноутбуку. Я действительно не купил USB-сканер, так как он довольно дорог для ученика. Поэтому мне нужно собрать доказательства того, что этот сканер будет работать с моей программой.

Может ли сканер считывать штрих-код (предположительно, распечатывать онлайн) и хранить его в переменной? Если да, то верно ли, что событие действия для печати сканера будет читаться точно так же, как клавиатурное нажатие? Если да, то как бы выглядела линия кода?

Кроме того, если вы можете опубликовать свой опыт с помощью сканеров штрих-кодов или дать какие-либо советы, например, какие сканеры купить, что бы помогло много. Ура!

4b9b3361

Ответ 1

Недавно мне пришлось внедрить систему сканера для взаимодействия с java.

Я использовал Honeywell Voyager MS9540 сканер штрих-кода USB.

По умолчанию сканер отправил данные прямо как ввод с клавиатуры - не требуется драйвер.

Но было очень легко заставить эту модель взаимодействовать напрямую с java, а не с помощью клавиатуры (для использования штрих-кодов в качестве переменных в java, как вы упомянули).

Эта модель имеет настройку для эмуляции последовательного порта, затем вы можете прочитать отсканированные данные с помощью пакета javax.comm. Для меня это было намного лучше, чем клавиатурный крючок, чтобы получить данные штрих-кода, потому что программа не нуждается в фокусе, прежде чем сможет интерпретировать сканирование (я бы не хотел создавать глобальный крючок клавиатуры).

Моя программа java считывает все данные из указанного последовательного порта и записывает штрих-код в базу данных. Я также настраиваю программу для передачи любых нераспознанных штрих-кодов на клавиатуру (любой штрих-код, который не было создано моим приложением, - я использовал отдельную подпись на своих штрих-кодах), поэтому он работал бы как обычный сканер штрих-кода для любых других приложений, которые могли бы читать штрих-коды с клавиатуры.

Возможно, вы могли читать данные непосредственно с любого USB-сканера (без эмуляции последовательного порта, который имеет эта модель), выполняя интенсивное кодирование JNDI, но я не был готов тратить время на разработку собственного кода.

Чтобы настроить эту конкретную модель для эмуляции последовательного порта, все, что вы делаете, - это сканировать определенный штрих-код в документе этот со сканером, который вы хотите настройки. Это штрих-код под названием "Режим последовательной эмуляции".

В этом сканере есть требуется драйвер для эмуляции последовательного порта. Я нашел инструкции по реализации и необходимые драйверы здесь (на вкладке "программное обеспечение" ). Загрузите пакет под названием "Honeywell Scanning and Mobility (HSM) USB Serial Driver". В документе под названием "Руководство по началу работы с USB-драйвером USB HSM" были инструкции.

Если вы не знакомы с javax.comm API. Пожалуйста, прочитайте введение в этом примере Рика Проктора - он расскажет вам, где взять банку и куда поместить файлы (javax.comm не входит в стандартную комплектацию большинства пакетов java).

Я уверен, что есть другие модели сканеров, которые имеют эмуляцию последовательного порта (я не работаю для 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 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);
        }
    };    
}

Ответ 2

Сканер bardcode, который я использовал, действовал как клавиатурное устройство (оно отображалось как USB-устройство HID-клавиатуры в операционной системе). Когда штрих-код был отсканирован, он отправил код, как если бы он был напечатан. Никаких специальных API-интерфейсов для взаимодействия с ним не требуется.

Ответ 3

Я знаю, что это довольно старый поток, но поиск может помочь вам.

Это можно рассматривать как дополнение к ответу Geronimo:

Для ОС Linux нет необходимости устанавливать драйверы для сканеров штрих-кода в режиме последовательной эмуляции, так как есть встроенная поддержка последовательных портов USB. Мы используем несколько типов сканеров Honeywell, и все они работают из коробки, эти сканеры в серийной эмуляции отображаются в наших системах как /dev/ttyACM 0,/dev/ttyACM1 и т.д.

Недавно мы переключились с javax.comm на jssc в качестве библиотеки java для интерфейса последовательных портов. Если я хорошо помню, то под 64-битной системой Windows 7 библиотека javax.comm не может читать или писать с/на последовательный порт, а jssc имеет очень похожий api.

Ответ 4

Я понимаю, что это был старый вопрос, но решил, что добавлю дополнительное решение для имитации ввода сканера штрих-кода. Это решение работает только для имитации ввода сканера как данных клавиатуры.

Поскольку сканер часто использует только ввод с клавиатуры, мы можем имитировать это с помощью AutoHotkey script. Ниже приведен пример script:

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

; Barcode 1
; Hotkey = ctrl + alt + 1
^!1::
    SendInput [BC200015]
Return

; Barcode 2
; Hotkey = ctrl + alt + 2
^!2::
    SendInput [BC300013]
Return

Просто замените [BC300013] и [BC200015] на любой ожидаемый вход сканера.