2017-04-07 41 views
2

我有Datalogic Gryphon GFS4400二維條碼掃描器。我已經投入樹莓派,它可以作爲USB HID設備使用。我可以讀取條形碼並將輸出轉換爲默認TTY。Python,evdev,usb條形碼讀取器:如何解碼輸入數據

我想要創建一個serivce來處理讀取條形碼時的輸出。我正在使用python和evdev。

有人能指出我正確的方向如何將輸出轉換爲正確的字符?

的Python腳本是這樣的:

from evdev import InputDevice, categorize, ecodes 

device = InputDevice("/dev/input/by-id/usb-Datalogic_ADC__Inc._Handheld_Barcode_Scanner_S_N_G17A58010-event-kbd") # my keyboard 
for event in device.read_loop(): 
    if event.type == ecodes.EV_KEY: 
     print(categorize(event)) 

當我運行該腳本,閱讀一個條形碼487800017702297980000411000000000000702407088651000000,我得到下面的輸出:

key event at 1491586389.048072, 69 (KEY_NUMLOCK), down 
key event at 1491586389.049084, 69 (KEY_NUMLOCK), up 
key event at 1491586389.050085, 56 (KEY_LEFTALT), down 
key event at 1491586389.051081, 82 (KEY_KP0), down 
key event at 1491586389.052082, 82 (KEY_KP0), up 
key event at 1491586389.052082, 76 (KEY_KP5), down 
key event at 1491586389.053084, 76 (KEY_KP5), up 
key event at 1491586389.053084, 80 (KEY_KP2), down 
key event at 1491586389.054079, 80 (KEY_KP2), up 
key event at 1491586389.055084, 56 (KEY_LEFTALT), up 
key event at 1491586389.056080, 56 (KEY_LEFTALT), down 
key event at 1491586389.057088, 82 (KEY_KP0), down 
key event at 1491586389.058079, 82 (KEY_KP0), up 
key event at 1491586389.058079, 76 (KEY_KP5), down 
key event at 1491586389.059087, 76 (KEY_KP5), up 
key event at 1491586389.059087, 77 (KEY_KP6), down 
key event at 1491586389.060041, 77 (KEY_KP6), up 
key event at 1491586389.061046, 56 (KEY_LEFTALT), up 
key event at 1491586389.062036, 56 (KEY_LEFTALT), down 
key event at 1491586389.063100, 82 (KEY_KP0), down 
key event at 1491586389.098114, 56 (KEY_LEFTALT), up 
key event at 1491586389.099104, 56 (KEY_LEFTALT), down 
key event at 1491586389.100126, 82 (KEY_KP0), down 
key event at 1491586389.101125, 82 (KEY_KP0), up 
key event at 1491586389.101125, 76 (KEY_KP5), down 
key event at 1491586389.102114, 76 (KEY_KP5), up 
key event at 1491586389.103118, 76 (KEY_KP5), down 
key event at 1491586389.104115, 76 (KEY_KP5), up 
key event at 1491586389.105114, 56 (KEY_LEFTALT), up 
key event at 1491586389.106111, 56 (KEY_LEFTALT), down 
key event at 1491586389.107127, 82 (KEY_KP0), down 
key event at 1491586389.108134, 82 (KEY_KP0), up 
key event at 1491586389.108134, 76 (KEY_KP5), down 
key event at 1491586389.109121, 76 (KEY_KP5), up 
key event at 1491586389.128128, 76 (KEY_KP5), up 
key event at 1491586389.128128, 82 (KEY_KP0), down 
key event at 1491586389.129121, 82 (KEY_KP0), up 
key event at 1491586389.130107, 56 (KEY_LEFTALT), up 
key event at 1491586389.131113, 56 (KEY_LEFTALT), down 
key event at 1491586389.132127, 82 (KEY_KP0), down 
key event at 1491586389.133126, 82 (KEY_KP0), up 
key event at 1491586389.133126, 76 (KEY_KP5), down 
key event at 1491586389.134126, 76 (KEY_KP5), up 
key event at 1491586389.134126, 71 (KEY_KP7), down 
key event at 1491586389.135125, 71 (KEY_KP7), up 
key event at 1491586389.136104, 56 (KEY_LEFTALT), up 
key event at 1491586389.137125, 56 (KEY_LEFTALT), down 
key event at 1491586389.138119, 82 (KEY_KP0), down 
key event at 1491586389.139117, 82 (KEY_KP0), up 
key event at 1491586389.139117, 76 (KEY_KP5), down 
key event at 1491586389.175126, 82 (KEY_KP0), down 
key event at 1491586389.176117, 82 (KEY_KP0), up 
key event at 1491586389.176117, 75 (KEY_KP4), down 
key event at 1491586389.177134, 75 (KEY_KP4), up 
key event at 1491586389.177134, 72 (KEY_KP8), down 
key event at 1491586389.178129, 72 (KEY_KP8), up 
key event at 1491586389.179136, 56 (KEY_LEFTALT), up 
key event at 1491586389.180126, 56 (KEY_LEFTALT), down 
key event at 1491586389.181122, 82 (KEY_KP0), down 
key event at 1491586389.182130, 82 (KEY_KP0), up 
key event at 1491586389.182130, 76 (KEY_KP5), down 
key event at 1491586389.183130, 76 (KEY_KP5), up 
key event at 1491586389.183130, 80 (KEY_KP2), down 
key event at 1491586389.184116, 80 (KEY_KP2), up 
key event at 1491586389.185122, 56 (KEY_LEFTALT), up 
key event at 1491586389.186116, 56 (KEY_LEFTALT), down 
key event at 1491586389.187134, 82 (KEY_KP0), down 
key event at 1491586389.188125, 82 (KEY_KP0), up 
key event at 1491586389.188125, 75 (KEY_KP4), down 
key event at 1491586389.189137, 75 (KEY_KP4), up 
key event at 1491586389.189137, 73 (KEY_KP9), down 
key event at 1491586389.190129, 73 (KEY_KP9), up 
key event at 1491586389.191129, 56 (KEY_LEFTALT), up 
key event at 1491586389.192116, 56 (KEY_LEFTALT), down 
key event at 1491586389.193122, 82 (KEY_KP0), down 
key event at 1491586389.194118, 82 (KEY_KP0), up 
key event at 1491586389.194118, 75 (KEY_KP4), down 
key event at 1491586389.195127, 75 (KEY_KP4), up 
key event at 1491586389.195127, 73 (KEY_KP9), down 
key event at 1491586389.248120, 82 (KEY_KP0), up 
key event at 1491586389.248120, 75 (KEY_KP4), down 
key event at 1491586389.249143, 75 (KEY_KP4), up 
key event at 1491586389.249143, 72 (KEY_KP8), down 
key event at 1491586389.250109, 72 (KEY_KP8), up 
key event at 1491586389.251147, 56 (KEY_LEFTALT), up 
key event at 1491586389.252130, 56 (KEY_LEFTALT), down 
key event at 1491586389.253137, 82 (KEY_KP0), down 
key event at 1491586389.254141, 82 (KEY_KP0), up 
key event at 1491586389.254141, 75 (KEY_KP4), down 
key event at 1491586389.255155, 75 (KEY_KP4), up 
key event at 1491586389.255155, 72 (KEY_KP8), down 
key event at 1491586389.256129, 72 (KEY_KP8), up 
key event at 1491586389.257119, 56 (KEY_LEFTALT), up 
key event at 1491586389.258122, 56 (KEY_LEFTALT), down 
key event at 1491586389.259125, 82 (KEY_KP0), down 
key event at 1491586389.260129, 82 (KEY_KP0), up 
key event at 1491586389.260129, 75 (KEY_KP4), down 
key event at 1491586389.261136, 75 (KEY_KP4), up 
key event at 1491586389.261136, 72 (KEY_KP8), down 
key event at 1491586389.262124, 72 (KEY_KP8), up 
key event at 1491586389.263140, 56 (KEY_LEFTALT), up 
key event at 1491586389.264135, 56 (KEY_LEFTALT), down 
key event at 1491586389.265133, 82 (KEY_KP0), down 
key event at 1491586389.266125, 82 (KEY_KP0), up 
key event at 1491586389.266125, 75 (KEY_KP4), down 
key event at 1491586389.267131, 75 (KEY_KP4), up 
key event at 1491586389.267131, 72 (KEY_KP8), down 
key event at 1491586389.303143, 76 (KEY_KP5), down 
key event at 1491586389.304127, 76 (KEY_KP5), up 
key event at 1491586389.305146, 76 (KEY_KP5), down 
key event at 1491586389.306139, 76 (KEY_KP5), up 
key event at 1491586389.307145, 56 (KEY_LEFTALT), up 
key event at 1491586389.308130, 56 (KEY_LEFTALT), down 
key event at 1491586389.309137, 82 (KEY_KP0), down 
key event at 1491586389.310127, 82 (KEY_KP0), up 
key event at 1491586389.310127, 75 (KEY_KP4), down 
key event at 1491586389.311131, 75 (KEY_KP4), up 
key event at 1491586389.311131, 72 (KEY_KP8), down 
key event at 1491586389.312144, 72 (KEY_KP8), up 
key event at 1491586389.313135, 56 (KEY_LEFTALT), up 
key event at 1491586389.349137, 72 (KEY_KP8), up 
key event at 1491586389.350136, 56 (KEY_LEFTALT), up 
key event at 1491586389.351123, 56 (KEY_LEFTALT), down 
key event at 1491586389.352150, 82 (KEY_KP0), down 
key event at 1491586389.370200, 82 (KEY_KP0), down 
key event at 1491586389.371148, 82 (KEY_KP0), up 
key event at 1491586389.371148, 75 (KEY_KP4), down 
key event at 1491586389.372156, 75 (KEY_KP4), up 
key event at 1491586389.372156, 72 (KEY_KP8), down 
key event at 1491586389.373147, 72 (KEY_KP8), up 
key event at 1491586389.374121, 56 (KEY_LEFTALT), up 
key event at 1491586389.375140, 56 (KEY_LEFTALT), down 
key event at 1491586389.376138, 82 (KEY_KP0), down 
key event at 1491586389.377147, 82 (KEY_KP0), up 
key event at 1491586389.377147, 75 (KEY_KP4), down 
key event at 1491586389.378058, 75 (KEY_KP4), up 
key event at 1491586389.378058, 72 (KEY_KP8), down 
key event at 1491586389.379141, 72 (KEY_KP8), up 
key event at 1491586389.380119, 56 (KEY_LEFTALT), up 
key event at 1491586389.381159, 28 (KEY_ENTER), down 
key event at 1491586389.382118, 28 (KEY_ENTER), up 
key event at 1491586389.384121, 69 (KEY_NUMLOCK), down 
key event at 1491586389.385115, 69 (KEY_NUMLOCK), up 

我不知道如何將KEY_xxx轉換爲正確的字符。如果我只過濾下來的事件我還是不明白什麼是KEY_KPn的等Evetest給出了這樣的:

$ evtest /dev/input/event0 
Input driver version is 1.0.1 
Input device ID: bus 0x3 vendor 0x5f9 product 0x2216 version 0x110 
Input device name: "Datalogic ADC, Inc. Handheld Barcode Scanner" 
Supported events: 
    Event type 0 (EV_SYN) 
    Event type 1 (EV_KEY) 
    Event code 1 (KEY_ESC) 
    Event code 2 (KEY_1) 
    Event code 3 (KEY_2) 
    Event code 4 (KEY_3) 
    Event code 5 (KEY_4) 
    Event code 6 (KEY_5) 
    Event code 7 (KEY_6) 
    Event code 8 (KEY_7) 
    Event code 9 (KEY_8) 
    Event code 10 (KEY_9) 
    Event code 11 (KEY_0) 
    Event code 12 (KEY_MINUS) 
    Event code 13 (KEY_EQUAL) 
    Event code 14 (KEY_BACKSPACE) 
    Event code 15 (KEY_TAB) 
    Event code 16 (KEY_Q) 
    Event code 17 (KEY_W) 
    Event code 18 (KEY_E) 
    Event code 19 (KEY_R) 
    Event code 20 (KEY_T) 
    Event code 21 (KEY_Y) 
    Event code 22 (KEY_U) 
    Event code 23 (KEY_I) 
    Event code 24 (KEY_O) 
    Event code 25 (KEY_P) 
    Event code 26 (KEY_LEFTBRACE) 
    Event code 27 (KEY_RIGHTBRACE) 
    Event code 28 (KEY_ENTER) 
    Event code 29 (KEY_LEFTCTRL) 
    Event code 30 (KEY_A) 
    Event code 31 (KEY_S) 
    Event code 32 (KEY_D) 
    Event code 33 (KEY_F) 
    Event code 34 (KEY_G) 
    Event code 35 (KEY_H) 
    Event code 36 (KEY_J) 
    Event code 37 (KEY_K) 
    Event code 38 (KEY_L) 
    Event code 39 (KEY_SEMICOLON) 
    Event code 40 (KEY_APOSTROPHE) 
    Event code 41 (KEY_GRAVE) 
    Event code 42 (KEY_LEFTSHIFT) 
    Event code 43 (KEY_BACKSLASH) 
    Event code 44 (KEY_Z) 
    Event code 45 (KEY_X) 
    Event code 46 (KEY_C) 
    Event code 47 (KEY_V) 
    Event code 48 (KEY_B) 
    Event code 49 (KEY_N) 
    Event code 50 (KEY_M) 
    Event code 51 (KEY_COMMA) 
    Event code 52 (KEY_DOT) 
    Event code 53 (KEY_SLASH) 
    Event code 54 (KEY_RIGHTSHIFT) 
    Event code 55 (KEY_KPASTERISK) 
    Event code 56 (KEY_LEFTALT) 
    Event code 57 (KEY_SPACE) 
    Event code 58 (KEY_CAPSLOCK) 
    Event code 59 (KEY_F1) 
    Event code 60 (KEY_F2) 
    Event code 61 (KEY_F3) 
    Event code 62 (KEY_F4) 
    Event code 63 (KEY_F5) 
    Event code 64 (KEY_F6) 
    Event code 65 (KEY_F7) 
    Event code 66 (KEY_F8) 
    Event code 67 (KEY_F9) 
    Event code 68 (KEY_F10) 
    Event code 69 (KEY_NUMLOCK) 
    Event code 70 (KEY_SCROLLLOCK) 
    Event code 71 (KEY_KP7) 
    Event code 72 (KEY_KP8) 
    Event code 73 (KEY_KP9) 
    Event code 74 (KEY_KPMINUS) 
    Event code 75 (KEY_KP4) 
    Event code 76 (KEY_KP5) 
    Event code 77 (KEY_KP6) 
    Event code 78 (KEY_KPPLUS) 
    Event code 79 (KEY_KP1) 
    Event code 80 (KEY_KP2) 
    Event code 81 (KEY_KP3) 
    Event code 82 (KEY_KP0) 
    Event code 83 (KEY_KPDOT) 
    Event code 85 (KEY_ZENKAKUHANKAKU) 
    Event code 86 (KEY_102ND) 
    Event code 87 (KEY_F11) 
    Event code 88 (KEY_F12) 
    Event code 89 (KEY_RO) 
    Event code 90 (KEY_KATAKANA) 
    Event code 91 (KEY_HIRAGANA) 
    Event code 92 (KEY_HENKAN) 
    Event code 93 (KEY_KATAKANAHIRAGANA) 
    Event code 94 (KEY_MUHENKAN) 
    Event code 95 (KEY_KPJPCOMMA) 
    Event code 96 (KEY_KPENTER) 
    Event code 97 (KEY_RIGHTCTRL) 
    Event code 98 (KEY_KPSLASH) 
    Event code 99 (KEY_SYSRQ) 
    Event code 100 (KEY_RIGHTALT) 
    Event code 102 (KEY_HOME) 
    Event code 103 (KEY_UP) 
    Event code 104 (KEY_PAGEUP) 
    Event code 105 (KEY_LEFT) 
    Event code 106 (KEY_RIGHT) 
    Event code 107 (KEY_END) 
    Event code 108 (KEY_DOWN) 
    Event code 109 (KEY_PAGEDOWN) 
    Event code 110 (KEY_INSERT) 
    Event code 111 (KEY_DELETE) 
    Event code 113 (KEY_MUTE) 
    Event code 114 (KEY_VOLUMEDOWN) 
    Event code 115 (KEY_VOLUMEUP) 
    Event code 116 (KEY_POWER) 
    Event code 117 (KEY_KPEQUAL) 
    Event code 119 (KEY_PAUSE) 
    Event code 121 (KEY_KPCOMMA) 
    Event code 122 (KEY_HANGUEL) 
    Event code 123 (KEY_HANJA) 
    Event code 124 (KEY_YEN) 
    Event code 125 (KEY_LEFTMETA) 
    Event code 126 (KEY_RIGHTMETA) 
    Event code 127 (KEY_COMPOSE) 
    Event code 128 (KEY_STOP) 
    Event code 129 (KEY_AGAIN) 
    Event code 130 (KEY_PROPS) 
    Event code 131 (KEY_UNDO) 
    Event code 132 (KEY_FRONT) 
    Event code 133 (KEY_COPY) 
    Event code 134 (KEY_OPEN) 
    Event code 135 (KEY_PASTE) 
    Event code 136 (KEY_FIND) 
    Event code 137 (KEY_CUT) 
    Event code 138 (KEY_HELP) 
    Event code 140 (KEY_CALC) 
    Event code 142 (KEY_SLEEP) 
    Event code 150 (KEY_WWW) 
    Event code 152 (KEY_SCREENLOCK) 
    Event code 158 (KEY_BACK) 
    Event code 159 (KEY_FORWARD) 
    Event code 161 (KEY_EJECTCD) 
    Event code 163 (KEY_NEXTSONG) 
    Event code 164 (KEY_PLAYPAUSE) 
    Event code 165 (KEY_PREVIOUSSONG) 
    Event code 166 (KEY_STOPCD) 
    Event code 173 (KEY_REFRESH) 
    Event code 176 (KEY_EDIT) 
    Event code 177 (KEY_SCROLLUP) 
    Event code 178 (KEY_SCROLLDOWN) 
    Event code 179 (KEY_KPLEFTPAREN) 
    Event code 180 (KEY_KPRIGHTPAREN) 
    Event code 183 (KEY_F13) 
    Event code 184 (KEY_F14) 
    Event code 185 (KEY_F15) 
    Event code 186 (KEY_F16) 
    Event code 187 (KEY_F17) 
    Event code 188 (KEY_F18) 
    Event code 189 (KEY_F19) 
    Event code 190 (KEY_F20) 
    Event code 191 (KEY_F21) 
    Event code 192 (KEY_F22) 
    Event code 193 (KEY_F23) 
    Event code 194 (KEY_F24) 
    Event code 240 (KEY_UNKNOWN) 
    Event type 4 (EV_MSC) 
    Event code 4 (MSC_SCAN) 
    Event type 17 (EV_LED) 
    Event code 0 (LED_NUML) 
    Event code 1 (LED_CAPSL) 
    Event code 2 (LED_SCROLLL) 
    Event code 3 (LED_COMPOSE) 
    Event code 4 (LED_KANA) 
    Event type 20 (EV_REP) 
Properties: 
Testing ... (interrupt to exit) 

任何幫助表示讚賞!謝謝。

回答

2

爲了得到無人駕駛字符(字節)或塊的單個事件字節

,USB條形碼閱讀器模擬HID設備(實際上是鍵盤)。這有一些整齊的特點:

  • 它的作品開箱,
  • 它可以在任何應用程序,
  • 它可以在任何操作系統。

讀者的默認行爲只是模擬擊鍵。他們讀取代碼,對其進行解碼,將其轉換爲文本,然後將文本轉換爲按鍵。您的計算機唯一看到的是USB鍵盤掃描代碼,您的操作系統會將擊鍵轉換回文本。這有一個主要缺點:它依賴於鍵盤語言映射設置,因此讀者必須知道使用哪個鍵盤映射(在HID中沒有通用的方式發送文本而不是鍵)。

爲了解決這個問題,一些條碼掃描器可以(ab)使用Windows輸入子系統的功能,用戶可以直接輸入ASCII碼。啓用功能後,閱讀器模擬鍵入十進制ASCII碼號碼,同時按住左側Alt鍵。這樣,就不存在對當前鍵盤映射的依賴(但是這又使得對Windows輸入層的依賴)。

在這裏,這是發生了什麼。首先,條碼在NumLock鍵上按下一個鍵,檢索Num Lock的當前狀態(它將收到Num Lock LED狀態的開關),以確保啓用它。然後它發佈一系列Alt按+數字按/釋放+ Alt發佈。如果你解碼它,它是:052056055050524十進制ASCII碼,568557502

如果更改的配置您的閱讀器,您可能可以禁用此功能,以使用給定的鍵盤映射回到通常的輸入鍵。條形碼的配置通常需要掃描手冊中的特殊條形碼。如果你沒有它,你的條形碼手冊應該可以在網上找到。大多數情況下,配置代碼可以在給定品牌內互操作。

+0

謝謝你的解釋!你是對的。 – iiro

1

這意味着它字節定向,所以每一個事件提供一個字符設備 1個字節(UNICODE UTF-8)的信息

從每個事件得到一個unicode字母(1個字節)條形碼掃描儀產生可以使用

ev1 = "" 
ev1 = event.unicode 

然後追加ev1, ev2,...以面向塊的格式。使用數組緩衝器追加面向看到http://en.wikipedia.org/wiki/Device_file

還可以檢查用於α-unicode的event.unicode.isalpha()

http://www.stackoverflow.com/questions/14111381/how-to-make-pygame-print-input-from-user

+0

這對我有點幫助!現在我明白了,首先它說numlock,然後離開ALT,然後使用數字鍵盤0,5,2這是u + 052 = 4.謝謝:) – iiro

相關問題