Недавно мне пришлось внедрить систему сканирования для взаимодействия с java.
Я использовал USB-сканер штрих-кода Honeywell Voyager MS9540.
По умолчанию сканер отправляет данные прямо в виде ввода с клавиатуры — драйвер не требуется.
Но было очень легко заставить эту модель взаимодействовать напрямую с java, а не использовать клавиатурный хук (чтобы использовать штрих-коды в качестве переменных в java, как вы упомянули).
Эта модель имеет настройку для эмуляции последовательного порта, после чего вы можете прочитать отсканированные данные с помощью пакета javax.comm. Для меня это было намного лучше, чем клавиатурный хук для получения данных штрих-кода, потому что программе не нужен фокус, прежде чем она сможет интерпретировать сканирование (я бы не хотел создавать глобальный клавиатурный хук) .
Моя программа Java считывает все входные данные с указанного последовательного порта и записывает штрих-код в базу данных. Я также настроил программу для передачи любых нераспознанных сканированных штрих-кодов на клавиатуру (любой штрих-код, который не был создан моим приложением — я использовал отдельную подпись для своих штрих-кодов), чтобы он работал как обычный сканер штрих-кода для любых других приложений, которые могут считывать штрих-коды с клавиатуры.
Вероятно, вы могли бы считывать данные напрямую с любого USB-сканера (без эмуляции последовательного порта, которая есть в этой модели), выполняя интенсивное кодирование JNI, но я не был готов тратить время на разработку собственного кода.
Чтобы настроить эту конкретную модель для эмуляции последовательного порта, все, что вам нужно сделать, это отсканировать определенный штрих-код в этот документ со сканером, который вы хотите настроить. Это штрих-код под названием «Режим последовательной эмуляции».
Для этого сканера требуется драйвер для эмуляции последовательного порта. Я нашел инструкции по внедрению и необходимые драйверы здесь (на вкладке "программное обеспечение"). Загрузите пакет под названием «Последовательный USB-драйвер Honeywell Scanning and Mobility (HSM)». В PDF-файле под названием «Руководство по началу работы с последовательным драйвером HSM USB» были инструкции.
Если вы не знакомы с API javax.comm. Пожалуйста, прочтите введение в этом примере Рика Проктора — там рассказывается вам, где взять банку и куда поместить файлы (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'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);
}
};
}
person
egerardus
schedule
23.12.2011