Implementação de Scanner de código de barras em Java [fechado]

Meus senhores, tenho uma pergunta. O escola Java projeto que estou trabalhando atualmente requer que eu tenha um Scanner de código de Barras USB como uma entrada externa para ser conectado ao meu laptop. Eu realmente não comprei o Scanner USB desde que é muito caro para um estudante. Tenho de reunir provas de que este Scanner funcionaria com o meu programa.

O Scanner seria capaz de ler um código de barras (presumivelmente impresso online) e armazená-lo numa variável? Se assim for, é verdade que o evento de ação para a imprensa do scanner ser lido exactamente como um teclado? Em caso afirmativo, como seria a linha de código?

Também, se você pudesse postar suas experiências com Scanners de código de barras, ou dar qualquer conselho, como Qual Scanner para comprar, isso ajudaria muito. Saúde!

Author: user976123, 2011-11-16

4 answers

Recentemente tive que implementar um sistema de scanner para interagir com java.

Eu usei Honeywell Voyager MS9540 scanner de código de barras USB.

Por omissão, o scanner enviou os dados directamente como entrada do teclado - não é necessário nenhum controlador.

Mas foi muito fácil conseguir que este modelo interage directamente com java em vez de usar um gancho de teclado (para usar os códigos de barras como variáveis em java, como mencionou).

Este modelo tem uma configuração para emular uma porta serial, você pode então ler os dados digitalizados usando o javax.pacote de comunicações. Para mim, isso foi muito melhor do que um gancho de teclado para obter os dados do código de barras, porque o programa não precisa do foco antes de ser capaz de interpretar um scan (eu não gostaria de criar um gancho de teclado global).

O meu programa java lê todas as entradas da porta série especificada e escreve o código de barras numa base de dados. Eu também configurei o programa para passar qualquer scans de código de barras não reconhecido para o teclado (qualquer código de barras que o meu aplicativo não criou - eu usei uma assinatura distinta em meus códigos de barras) isso foi para que ele iria funcionar como um scanner de código de barras regular para quaisquer outros aplicativos que possam ler códigos de barras do teclado.

{[[2]} você poderia provavelmente ler os dados diretamente de qualquer scanner USB (sem a emulação de porta série que este modelo tem) fazendo algum código JNI intensivo, mas eu não estava preparado para tomar o tempo para trabalhar para fora do código nativo.

Para configurar este modelo em particular para Serie emulação do Porto tudo o que você faz é digitalizar um código de barras específico em isto documento com o scanner que deseja configurar. É o código de barras intitulado "modo de emulação Serial".

Este scanner necessita de um controlador para a emulação da porta série. Encontrei as instruções de implementação e os condutores necessários. toma. ( na página "software"). Baixe o pacote intitulado: "Honeywell Scanning and Mobility (HSM) USB Serial Driver". O PDF intitulado " HSM USB Driver Serial Guia de introdução" tinha as instruções.

Se não estiver familiarizado com o javax.comm API. Por favor, leia a introdução isto exemplo de Rick Proctor-ele lhe diz Onde obter o jarro e onde colocar os arquivos (javax.comm não vem padrão com a maioria dos pacotes java).

Tenho a certeza que há outros modelos de scanner que têm emulação de porta em série (não trabalho para a Honeywell). Aqui está uma versão um pouco despojada da minha classe de leitor de códigos de barras:
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);
        }
    };    
}
 32
Author: egerardus, 2018-11-30 00:00:05

O scanner de código de barras que usei agiu como um dispositivo de teclado (apareceu como um dispositivo USB de teclado escondido no sistema operativo). Quando o código de barras foi digitalizado, enviou o código como se tivesse sido digitado. Não foram necessárias APIs especiais para interagir com ele.

 9
Author: prunge, 2011-11-16 04:51:15
Eu sei que é um assunto antigo, mas a busca pode levar-te lá.

Isto pode ser tratado como uma adição à resposta do Geronimo:

Para o Linux OS não há necessidade de instalar drivers para scanners de código de barras no modo de emulação série, uma vez que existe suporte nativo para portas seriais USB. Nós usamos vários tipos de scanners Honeywell e todos eles funcionam fora da caixa, esses scanners em emulação série mostra em nossos sistemas como /dev /ttyACM0,/dev / ttyACM1 etc.

Recentemente temos trocado do javax.comm to jssc as a java library to interface serial ports. Se bem me lembro, debaixo do sistema javax do Windows 7 64bit.a biblioteca comm não consegue ler ou escrever de/para a porta série e o jssc tem uma api muito semelhante.

 7
Author: Pavel Kucera, 2015-01-22 06:11:41
Eu sei que esta era uma pergunta antiga, mas pensei em Adicionar uma solução adicional para simular a entrada do Scanner de código de barras. Esta solução só funciona para simular a entrada do scanner como dados de teclado.

Uma vez que o scanner normalmente usa apenas a entrada do teclado, podemos simular isto usando um script AutoHotkey. Abaixo está um exemplo de um 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

Apenas substitua [BC300013] e [BC200015] por qualquer que seja a sua entrada de scanner esperada.

 0
Author: philosowaffle, 2015-08-19 20:46:38