Implementação de Scanner de código de barras em Java [fechado]
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!
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);
}
};
}
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.
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.
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.