मुझे हाल ही में जावा के साथ बातचीत करने के लिए स्कैनर सिस्टम लागू करना पड़ा।
मैंने हनीवेल वॉयजर MS9540 यूएसबी बारकोड स्कैनर का उपयोग किया।
डिफ़ॉल्ट रूप से स्कैनर ने सीधे डेटा इनपुट के रूप में डेटा भेजा - कोई ड्राइवर आवश्यक नहीं है।
लेकिन यह इस मॉडल बातचीत करने के लिए सीधे जावा के बजाय एक कुंजीपटल हुक (, जावा में चर के रूप में उपयोग करने के लिए बारकोड के रूप में आप का उल्लेख) का उपयोग कर के साथ पाने के लिए बहुत आसान था।
इस मॉडल में एक सीरियल पोर्ट अनुकरण करने की सेटिंग है, तो आप javax.comm पैकेज का उपयोग करके स्कैन किए गए डेटा को पढ़ सकते हैं। मेरे लिए, यह बहुत बारकोड डेटा प्राप्त करने के लिए कीबोर्ड हुक से बेहतर था क्योंकि प्रोग्राम को स्कैन की व्याख्या करने में सक्षम होने से पहले फोकस की आवश्यकता नहीं है (मैं एक वैश्विक कीबोर्ड हुक नहीं बनाना चाहता)।
मेरा जावा प्रोग्राम निर्दिष्ट सीरियल पोर्ट से सभी इनपुट पढ़ता है और बारकोड को डेटाबेस में लिखता है। मैंने प्रोग्राम को किसी भी अपरिचित बारकोड स्कैन को पास करने के लिए प्रोग्राम भी सेट किया है (कोई भी बारकोड जिसे मेरा ऐप नहीं बनाया गया था - मैंने अपने बारकोड पर एक अलग हस्ताक्षर का उपयोग किया था) ऐसा इसलिए था कि यह किसी अन्य ऐप के लिए नियमित बारकोड स्कैनर के रूप में काम करेगा कीबोर्ड से बारकोड पढ़ें।
कुछ गहन जेएनडीआई कोडिंग करके आप शायद किसी भी यूएसबी स्कैनर से सीधे डेटा पढ़ सकते हैं (इस मॉडल के सीरियल पोर्ट इम्यूलेशन के बिना) लेकिन मैं देशी कोड को काम करने के लिए समय निकालने के लिए तैयार नहीं था।
सीरियल पोर्ट अनुकरण के लिए इस विशेष मॉडल को कॉन्फ़िगर करने के लिए आप जो स्कैनर कॉन्फ़िगर करना चाहते हैं उसके साथ this दस्तावेज़ में एक विशिष्ट बारकोड स्कैन करें। यह "सीरियल इम्यूलेशन मोड" शीर्षक वाला बारकोड है।
यह स्कैनर सीरियल पोर्ट अनुकरण के लिए ड्राइवर की आवश्यकता है। मुझे कार्यान्वयन निर्देश और आवश्यक ड्राइवर here ("सॉफ़्टवेयर" टैब के अंतर्गत) मिला। शीर्षक वाले पैकेज को डाउनलोड करें: "हनीवेल स्कैनिंग और मोबिलिटी (एचएसएम) यूएसबी सीरियल ड्राइवर"। पीडीएफ शीर्षक "एचएसएम यूएसबी सीरियल ड्राइवर प्रारंभ करना गाइड" निर्देश था।
यदि आप javax.comm API से परिचित नहीं हैं।कृपया रिक प्रोक्टर द्वारा this उदाहरण में परिचय पढ़ें - यह आपको बताता है कि जार कहाँ प्राप्त करें और फ़ाइलों को कहां रखा जाए (javax.comm अधिकांश जावा पैकेजों के साथ मानक नहीं आता है)।
मुझे यकीन है कि सीरियल पोर्ट इम्यूलेशन (मैं हनीवेल के लिए काम नहीं करता) के आसपास अन्य स्कैनर मॉडल हैं।
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);
}
};
}
यदि आपका कर्सर टेक्स्ट-बॉक्स या इनपुट फ़ील्ड में है, तो स्कैनर केवल कोड को 'लिख' देगा। स्कैनर के साथ कुछ खास नहीं है। आपको कोई घटना नहीं मिलेगी। हालांकि यदि आपके पास कोई वेबपृष्ठ है, तो आप जेएस की 'ऑनचेंज' घटना जैसी कुछ कोशिश कर सकते हैं। – Nishant