1

Temat: Czytnik kodów kreskowych

Mam taki pomysł. Chcę podłączyć czytnik kodów kreskowych do routera z OpenWRT.
Z tego co wyczytałem, są wersje PS2/RS232/USB. Czytnik udaje klawiaturę i wysyła kod liczbowy (kończy enterem).
PS2 odpada. RS'em232 musiałbym puszczać przez FTDI, dodatkowe zasilanie itp. Raczej zadziała, ale...

Najfajniejsze wydaje się podłączenie przez USB. I teraz moje pytanie. Jak się to może objawić na OpenWRT?
Czy ktoś z was podłączał czytnik kodów kreskowych?
Albo zwykłą klawiaturę. Czy jak podłączymy do routera takie coś to czy zwykły "scanf" w C odczyta mi to?
Kolejne pytanie, co będzie jak programik będzie działał w tle (cron), to jak to czytać? A może dało by się jakiś skrypt napisać?

Mam też alternatywę, kamerka, odczyt obrazu, analiza, wyszukanie kresek. Też się da, ale z czytnikiem było by znacznie łatwiej (chyba).

2

Odp: Czytnik kodów kreskowych

http://openrouter.info/forum/viewtopic. … 6871#p6871 ?

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

3

Odp: Czytnik kodów kreskowych

Dzięki Cezay,
Zamówiłem czytnik, podłącze i zobaczymy jak to opanować.
Napiszę co mi wyszło.

4 (edytowany przez uggp 2013-12-12 00:08:45)

Odp: Czytnik kodów kreskowych

Kupiłem nowego TL-WDR3600 wgrałem gargoyla i do niego podłączyłem czytnik kodów DtLink MJ-4209A.
example.conf ustawiłem na:

KEY_0    1    echo 0 >> /tmp/barcode.txt
KEY_1    1    echo 1 >> /tmp/barcode.txt
KEY_2    1    echo 2 >> /tmp/barcode.txt
KEY_3    1    echo 3 >> /tmp/barcode.txt
KEY_4    1    echo 4 >> /tmp/barcode.txt
KEY_5    1    echo 5 >> /tmp/barcode.txt
KEY_6    1    echo 6 >> /tmp/barcode.txt
KEY_7    1    echo 7 >> /tmp/barcode.txt
KEY_8    1    echo 8 >> /tmp/barcode.txt
KEY_9    1    echo 9 >> /tmp/barcode.txt
KEY_ENTER    1    echo E >> /tmp/barcode.txt

Niestety w pliku barcode mam znaki nie po kolei.
Przykład (zapisuje w poziomie, normalnie każdy znak jest w nowej linii)
0070E1000 a powinno być 10000007E
0100E0070 a powinno być 10000007E
lub inny kod:
11111300E a powinno być 11301011E

Czytnik podłączony do laptopa z ubuntu daje poprawne sekwencje. Klawiatura na USB podłączona do routera też.
Więc czemu jest tak pomieszane? Jeżeli by za szybko te znaki leciały, to by zgubił chyba. A tu jest taka dziwna kolejność.

5

Odp: Czytnik kodów kreskowych

Nie wiem co jest przyczyną mieszania ale jeśli chcesz mieć kod w jednej linii to za "echo" wstaw -n

TL-WR1043ND: HDD-USB, extroot, LCD, Pilot, MP3 - Radio Player, NAS, Torrent, FTP, Sterowanie głosem, Komunikaty Głosowe, Termometr, PowerSwitch - Sterownik oświetlenia, Budzik, LTE - ODU IDU 200
Raspberry Pi + HDMI-VGA + Lcd Controller + Lcd z laptopa = Pogodynka smile

6

Odp: Czytnik kodów kreskowych

Dodałem to -n, ale i tak jakieś jaja są.
A najlepsze, że
thd --dump /dev/input/event*
daje:

EV_KEY    KEY_1    1    /dev/input/event0
# KEY_1    1    command
EV_KEY    KEY_1    0    /dev/input/event0
# KEY_1    0    command
EV_KEY    KEY_0    1    /dev/input/event0
# KEY_0    1    command
EV_KEY    KEY_0    0    /dev/input/event0
# KEY_0    0    command
EV_KEY    KEY_0    1    /dev/input/event0
# KEY_0    1    command
EV_KEY    KEY_0    0    /dev/input/event0
# KEY_0    0    command
EV_KEY    KEY_0    1    /dev/input/event0
# KEY_0    1    command
EV_KEY    KEY_0    0    /dev/input/event0
# KEY_0    0    command
EV_KEY    KEY_0    1    /dev/input/event0
# KEY_0    1    command
EV_KEY    KEY_0    0    /dev/input/event0
# KEY_0    0    command
EV_KEY    KEY_0    1    /dev/input/event0
# KEY_0    1    command
EV_KEY    KEY_0    0    /dev/input/event0
# KEY_0    0    command
EV_KEY    KEY_0    1    /dev/input/event0
# KEY_0    1    command
EV_KEY    KEY_0    0    /dev/input/event0
# KEY_0    0    command
EV_KEY    KEY_7    1    /dev/input/event0
# KEY_7    1    command
EV_KEY    KEY_7    0    /dev/input/event0
# KEY_7    0    command
EV_KEY    KEY_ENTER    1    /dev/input/event0
# KEY_ENTER    1    command
EV_KEY    KEY_ENTER    0    /dev/input/event0
# KEY_ENTER    0    command

Czyli poprawnie odczytany kod EAN8: 10000007 (taki sobie wydrukowałem testowo na kartce)
Skoro event'y idą po kolei to czemu echo nie wstawia w kolejności? Coś ze strumieniami?

7

Odp: Czytnik kodów kreskowych

thd --dump /dev/input/event* | grep ^EV >> /tmp/plik.txt ?

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

8 (edytowany przez uggp 2013-12-13 21:19:21)

Odp: Czytnik kodów kreskowych

EV_KEY    KEY_1    1    /dev/input/event0
EV_KEY    KEY_1    0    /dev/input/event0
EV_KEY    KEY_0    1    /dev/input/event0
EV_KEY    KEY_0    0    /dev/input/event0
EV_KEY    KEY_0    1    /dev/input/event0
EV_KEY    KEY_0    0    /dev/input/event0
EV_KEY    KEY_0    1    /dev/input/event0
EV_KEY    KEY_0    0    /dev/input/event0
EV_KEY    KEY_0    1    /dev/input/event0
EV_KEY    KEY_0    0    /dev/input/event0
EV_KEY    KEY_0    1    /dev/input/event0
EV_KEY    KEY_0    0    /dev/input/event0
EV_KEY    KEY_0    1    /dev/input/event0
EV_KEY    KEY_0    0    /dev/input/event0
EV_KEY    KEY_7    1    /dev/input/event0
EV_KEY    KEY_7    0    /dev/input/event0
EV_KEY    KEY_ENTER    1    /dev/input/event0
EV_KEY    KEY_ENTER    0    /dev/input/event0

9

Odp: Czytnik kodów kreskowych

No, jeszcze co drugą linię trzeba wyciąć.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

10

Odp: Czytnik kodów kreskowych

a kumam, czyli od razu thd ładować do pliku
w sumie czemu nie,
i tak potem czytam to programem w C więc w sumie...

tylko thd musi ruszyć jako komenda a nie daemon, tak?

11

Odp: Czytnik kodów kreskowych

& na końcu? O ile ma własnego przełącznika do tego.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

12

Odp: Czytnik kodów kreskowych

wygląda na to że z & działa,
puściłem

thd --dump /dev/input/event* >> /tmp/plik.txt&

i zapisuje ładnie w tle

tylko teraz wymyślić, kiedy sprawdzać ten plik czy coś przybyło,
bo początkowo napisałem sobie program co jest wyzwalany po ENTER. Jednak sam /enter/ też jest nie w kolejności.
I trzeba by na około...

albo bezpośrednio:
http://h-wrt.com/en/doc/bcode

13

Odp: Czytnik kodów kreskowych

A nie prościej po prostu zmodyfikować ten program, żeby zbierał dane i wywołał coś jak na enter natrafi?

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

14

Odp: Czytnik kodów kreskowych

No w sumie można...

15

Odp: Czytnik kodów kreskowych

zawsze w konfigu można zrobić:

KEY_ENTER    1    echo E >> /tmp/barcode.txt ; skrypt_sprawdzający.sh

TL-WR1043ND: HDD-USB, extroot, LCD, Pilot, MP3 - Radio Player, NAS, Torrent, FTP, Sterowanie głosem, Komunikaty Głosowe, Termometr, PowerSwitch - Sterownik oświetlenia, Budzik, LTE - ODU IDU 200
Raspberry Pi + HDMI-VGA + Lcd Controller + Lcd z laptopa = Pogodynka smile

16

Odp: Czytnik kodów kreskowych

Dzięki za sugestie. Zrobiłem jednak inaczej. Wywaliłem thd i napisałem swój programik (na bazie tego z sieci).

Tutaj kod, jakby ktoś kiedyś potrzebował barcode.c:

/* barcode.c */
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/input.h>
#define RETLEN 32
int main(int argc, char *argv[])
{
const char decode_scancode[12]={0,0,'1','2','3','4','5','6','7','8','9','0'};
struct input_event ev[64];
char retbc[RETLEN];
int i, p=0, e=0, size=sizeof(struct input_event);
for (i=0; i<RETLEN; i++) {retbc[i]=0;};
if ((argc==2) && (getuid()==0))
   {
   int fd=open(argv[1],O_RDONLY); 
   if (fd!=-1)
      {          
      while (!e)
         {
         int rd=read(fd,ev,size*64);
         if (rd<size) {e=1;}
         else 
            {
            for (i=0; i<((int)(rd/size)); i++)
               {
               if (ev[i].type==EV_KEY)
                  {
                  if ((ev[i].value==1) || (ev[i].value==2))
                     {
                     if (ev[i].code<12)
                        {
                        if (p<RETLEN)
                           {
                           retbc[p]=decode_scancode[ev[i].code];
                           p++;
                           }
                        else {e=1;};
                        }
                     else {if (ev[i].code==28) {e=1;};};
                     };
                  };
               };
            };
         };
      };
   };
printf("%s\n",retbc);
return 0;
} 

Potem decodebc.sh co chodzi w kółko

#!/bin/sh
while : 
do
   KOD=`barcode /dev/input/event0`
   innyprogram $KOD
   sleep 1
done

i na koniec do init.d

#!/bin/sh /etc/rc.common
# (C) 2008 openwrt.org

START=60

start() {
        /etc/decodebc.sh &
        }

Nie wiem tylko czy "zgodnie ze sztuką" zrobiłem init.d, w każdym razie teraz ładnie działa

17 (edytowany przez wabikboy 2013-12-14 12:26:50)

Odp: Czytnik kodów kreskowych

Zrestartuj router i sprawdź czy się uruchamia "decodebc.sh" przy starcie to będziesz wiedział czy prawidłowo zrobiłeś smile
A nie lepiej było by wywołać decodebc.sh po zeskanowaniu kodu gdyż zapychasz pamięć i przy okazji blokujesz procesor a jak wiadomo routery do demonów prędkości nie należą smile.

TL-WR1043ND: HDD-USB, extroot, LCD, Pilot, MP3 - Radio Player, NAS, Torrent, FTP, Sterowanie głosem, Komunikaty Głosowe, Termometr, PowerSwitch - Sterownik oświetlenia, Budzik, LTE - ODU IDU 200
Raspberry Pi + HDMI-VGA + Lcd Controller + Lcd z laptopa = Pogodynka smile

18

Odp: Czytnik kodów kreskowych

W poleceniu "barcode" jest funkcja "read". Read nie ruszy jak coś nie nadejdzie. Tak, że wszystko stoi i czeka aż z systemu nadejdzie jakiś klawisz. Cały skrypt zajmuje bardzo mało mocy procka. Ciężko go na TOP złapać.
Jedyny problem to jak wypniemy czytnik. Wtedy barcode przeleci bo open da false. Dlatego dałem sleep 1.

19

Odp: Czytnik kodów kreskowych

Mi chodzi o decodebc.sh że chodzi w kółko bez potrzeby i zajmuje procesor i pamiec a wywołać go możesz jak Ci wyżej napisałem czyli po każdym "KEY_ENTER    1 "
To jest tylko moja sugestia.

TL-WR1043ND: HDD-USB, extroot, LCD, Pilot, MP3 - Radio Player, NAS, Torrent, FTP, Sterowanie głosem, Komunikaty Głosowe, Termometr, PowerSwitch - Sterownik oświetlenia, Budzik, LTE - ODU IDU 200
Raspberry Pi + HDMI-VGA + Lcd Controller + Lcd z laptopa = Pogodynka smile

20

Odp: Czytnik kodów kreskowych

To tylko skrypt napisany jest "w kółko". Co do pamięci to masz rację, ale dużo tego nie bierze. Natomiast procesor nie jest obciążany. W praktyce ten skrypt jest w pauzie i jest cały czas zatrzymany, bo właśnie jedno z poleceń (barcode) "wisi". A dokładnie czeka na dane z read. A że read odwołuje się do systemu, to system nie głupi, i nie mieli tego na maks procesor, tylko trzyma proces w pauzie. Jak coś będzie miał na pożarcie dla read to puści proces, dając na wskaźniku dane odczytane.

A "KEY_ENTER" poleciał  w kosmos razem z thd smile. triggerhappy jest dobry do wyzwalania na jeden klawisz, ale kilka klawiszy coś pieprzy.