2011-11-16 22 views
19

अच्छा sirs, मेरे पास एक सवाल है। जिस स्कूल जावा प्रोजेक्ट में मैं वर्तमान में काम कर रहा हूं, मुझे अपने लैपटॉप से ​​कनेक्ट होने के लिए बाहरी इनपुट के रूप में एक यूएसबी बारकोड स्कैनर की आवश्यकता है। मैंने वास्तव में यूएसबी स्कैनर नहीं खरीदा है क्योंकि यह एक छात्र के लिए काफी महंगा है। इसलिए मुझे सबूत इकट्ठा करना है कि यह स्कैनर मेरे कार्यक्रम के साथ काम करेगा।जावा पर बारकोड स्कैनर कार्यान्वयन

क्या स्कैनर बारकोड (संभवतः ऑनलाइन मुद्रित) से पढ़ने में सक्षम होगा और इसे एक चर में संग्रहीत करेगा? यदि हां, तो क्या यह सच है कि स्कैनर के प्रेस के लिए एक्शन इवेंट बिल्कुल कीबोर्ड कीप्रेस की तरह पढ़ा जाएगा? यदि हां, तो कोड की रेखा कैसी दिखती है?

इसके अलावा, यदि आप बारकोड स्कैनर के साथ अपने अनुभव पोस्ट कर सकते हैं, या कोई सलाह दे सकते हैं, जैसे स्कैनर खरीदने के लिए, इससे बहुत मदद मिलेगी। चीयर्स!

+3

यदि आपका कर्सर टेक्स्ट-बॉक्स या इनपुट फ़ील्ड में है, तो स्कैनर केवल कोड को 'लिख' देगा। स्कैनर के साथ कुछ खास नहीं है। आपको कोई घटना नहीं मिलेगी। हालांकि यदि आपके पास कोई वेबपृष्ठ है, तो आप जेएस की 'ऑनचेंज' घटना जैसी कुछ कोशिश कर सकते हैं। – Nishant

उत्तर

8

मेरे द्वारा उपयोग किए गए बार्डकोड स्कैनर ने कीबोर्ड डिवाइस की तरह काम किया है (यह ऑपरेटिंग सिस्टम में एक छिपाई कीबोर्ड यूएसबी डिवाइस के रूप में दिखाया गया है)। जब बारकोड स्कैन किया गया था, तो उसने कोड भेजा जैसे कि इसे टाइप किया गया था। इसके साथ बातचीत करने के लिए कोई विशेष एपीआई की आवश्यकता नहीं थी।

+0

क्या मैं पूछ सकता हूं, आपको किस मॉडल को मिला? – user976123

+0

@ user976123 यह पिछले साल एक नौकरी पहले था, माफ करना, मुझे याद नहीं है कि मॉडल क्या था। – prunge

26

मुझे हाल ही में जावा के साथ बातचीत करने के लिए स्कैनर सिस्टम लागू करना पड़ा।

मैंने हनीवेल वॉयजर 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); 
     } 
    };  
} 
+0

ऐसा लगता है कि वे ड्राइवर केवल विंडोज के लिए हैं, इसलिए यदि आप इसे इस तरह से करते हैं तो आप विंडोज़ की तुलना में अन्य ऑपरेटिंग सिस्टम पर अपने प्रोग्राम का उपयोग नहीं कर पाएंगे। –

+0

सही हो सकता है, मुझे केवल विंडोज़ के लिए इसकी आवश्यकता है। मैंने गहराई से खोज नहीं की है लेकिन ऐसा कुछ होना चाहिए जो यूएसबी को लिनक्स या मैक – Geronimo

+0

@Geronimo के लिए COM पोर्ट में परिवर्तित करेगा: मुझे यह config.properties फ़ाइल कहां से मिल सकती है। –

4

मैं जानता हूँ कि यह काफी पुराना धागा लेकिन खोज तुम वहाँ मिल सकता है:

यहाँ मेरी बारकोड रीडर वर्ग की कुछ हद तक एक नीचे छीन संस्करण है।

लिनक्स ओएस के लिए धारावाहिक अनुकरण मोड में बारकोड स्कैनर के लिए ड्राइवरों स्थापित करने के लिए वहाँ के रूप में यूएसबी सीरियल पोर्ट के लिए देशी समर्थन है कोई जरूरत नहीं है:

यह Geronimo के जवाब देने के लिए एक अतिरिक्त के रूप में व्यवहार किया जा सकता है। हम हनीवेल स्कैनर के कई प्रकार का उपयोग करें और उन सभी को बॉक्स से बाहर काम करते हैं, धारावाहिक अनुकरण में उन लोगों के स्कैनर/dev/ttyACM0,/dev/ttyACM1 आदि के रूप में हमारे सिस्टम में चलता

हाल ही में हम javax.comm से बदला गया है धारावाहिक बंदरगाहों को इंटरफ़ेस करने के लिए जावा लाइब्रेरी के रूप में jssc को। अगर मुझे अच्छी तरह से याद है, विंडोज 7 64 बिट सिस्टम के तहत javax.comm लाइब्रेरी सीरियल पोर्ट से/पढ़ या लिख ​​नहीं सकती है और जेएसएससी बहुत समान एपीआई है।

+0

स्टैक ओवरफ्लो में आपका स्वागत है। कृपया संपादक से अपना उत्तर प्रारूपित करने का प्रयास करें। – Daenarys

0

मुझे एहसास हुआ कि यह एक पुराना सवाल था लेकिन मुझे लगा कि मैं बारकोड स्कैनर इनपुट अनुकरण करने के लिए एक अतिरिक्त समाधान जोड़ूंगा। यह समाधान केवल स्कैनर इनपुट को कीबोर्ड डेटा के रूप में अनुकरण करने के लिए काम करता है।

स्कैनर अक्सर कीबोर्ड इनपुट का उपयोग करते हैं, इसलिए हम इसे AutoHotkey स्क्रिप्ट का उपयोग करके अनुकरण कर सकते हैं।

#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] साथ जो कुछ भी आपके की उम्मीद स्कैनर इनपुट है बदल देते हैं: नीचे एक स्क्रिप्ट का एक उदाहरण है।

संबंधित मुद्दे