Advertisement
Guest User

Lecture d'un scanner de code barre USB HID en python

a guest
Sep 17th, 2012
522
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.64 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3. '''
  4. franssoa sur fr.comp.os.linux.configuration
  5.  
  6. Lecture de code EAN par lecteur de code barre sur port USB
  7. La douchette USB émule un clavier, mais je veux intercepter le code pour
  8. ne pas qu'il affecte stdin
  9.  
  10. Il s'agit d'une douchette noname. La commande 'lsusb' donne :
  11. Bus 002 Device 002: ID 04b4:0100 Cypress Semiconductor Corp. Cino FuzzyScan F760-B
  12.  
  13. sources & infos utiles :
  14. python-usb pour HID : http://www.micahcarrick.com/credit-card-reader-pyusb.html
  15. decodage des infos reçues : http://sourceforge.net/mailarchive/message.php?msg_id=9845412
  16. USD HID Keyboard Scan code : http://hp.vector.co.jp/authors/VA003720/lpproj/others/kbdjpn.htm
  17.  
  18. codé ici avec les pieds :-)
  19. '''
  20.  
  21. import sys
  22. import usb.core
  23. import usb.util
  24.  
  25. def lecture_code_barre():
  26.     VENDOR_ID = 0x04b4
  27.     PRODUCT_ID = 0x0100
  28.     DATA_SIZE = 16 # 224
  29.     NO_SCAN_CODE = {0x1E:'1', 0x1F:'2', 0x20:'3', 0x21:'4', 0x22:'5', 0x23:'6', 0x24:'7'
  30.         , 0x25:'8', 0x26:'9', 0x27:'0', 0x28:''} # 28=enter
  31.  
  32.     device = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID)
  33.  
  34.     if device is None:
  35.         sys.exit("Could not find Id System Barcode Reader.")
  36.  
  37.     if device.is_kernel_driver_active(0):   # On détache le périphérique du kernel, plus d'envoi sur stdin
  38.         try:
  39.             device.detach_kernel_driver(0)
  40.         except usb.core.USBError as e:
  41.             sys.exit("Could not detatch kernel driver: %s" % str(e))
  42.  
  43.     try:
  44.         device.set_configuration()
  45.         device.reset()
  46.     except usb.core.USBError as e:
  47.         sys.exit("Could not set configuration: %s" % str(e))
  48.    
  49.     endpoint = device[0][(0,0)][0]
  50.     data = []
  51.     lu = False
  52.     print "Attente de lecture..."
  53.     lecture=''
  54.  
  55.     while 1:
  56.         try:
  57.             data += device.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize)
  58.  
  59.             if not lu:
  60.                 print "Attente de lecture..."
  61.             lu = True
  62.  
  63.         except usb.core.USBError as e:
  64.             if e.args == (110,'Operation timed out') and lu:
  65.                 if len(data) < DATA_SIZE:
  66.                     print "Lecture incorrecte, recommencez. (%d bytes)" % len(data)
  67.                     print "Data: %s" % ''.join(map(hex, data))
  68.                     data = []
  69.                     lu = False
  70.                     continue
  71.                 else:
  72.                     for n in range(0,len(data),16):
  73.                         print ' '.join(map(hex,data[n:n+16]))
  74.                         lecture+=NO_SCAN_CODE[data[n+2]]
  75.                     break   # Code lu
  76.     return lecture
  77.  
  78. if __name__ == '__main__':
  79.     print lecture_code_barre()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement