Bar-Kode Scanner in OpenWrt

Diejenigen, die im Handel tätig sind, sicherlich wissen, was eine Registrierkasse ist, wieviel diese kostet und was für ein "unersetzbares" Ding es im Handel ist.

Wollen wir prüfen, ob es wirklich kompliziert ist eine Registrierkasse selber zusammen zu bauen. Wir werden hier nur über die Hardware sprechen und nicht über eine Datenbank für die Produkte, Debet und Kredit usw. Als Basis nehmen wir wieder unseren Router und versuchen einen Bar-Kode Scanner an ihn anzuschließen.

Auf der Stufe der Konfiguration von OpenWrt sind folgende Module auszuwählen:
Base system :
<*> busybox:
Linux System Utilities:
<*> lsusb
Kernel modules:
USB Support:
<M> kmod-usb-hid

Wollen wir die Pakete installieren:

root@OpenWrt:/# opkg install kmod-usb-hid
Installing kmod-usb-hid (2.6.36.2-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/kmod-usb-hid_2.6.36.2-1_brcm47xx.ipk.
Installing kmod-hid (2.6.36.2-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/kmod-hid_2.6.36.2-1_brcm47xx.ipk.
Installing kmod-input-core (2.6.36.2-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/kmod-input-core_2.6.36.2-1_brcm47xx.ipk.
Installing kmod-input-evdev (2.6.36.2-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/kmod-input-evdev_2.6.36.2-1_brcm47xx.ipk.
Configuring kmod-input-core.
Configuring kmod-hid.
Configuring kmod-input-evdev.
Configuring kmod-usb-hid.

Wir schließen den Bar-Kode Scanner an den USB-Eingang des Routers an und prüfen die Reaktion von Linux auf diese Aktivitäten ))

root@OpenWrt:/# dmesg
usb 1-1.3: new low speed USB device using ohci_hcd and address 5
input: TechScan Korea DG Dashuo USB-V4.0 as /devices/ssb0:1/usb1/1-1/1-1.3/1-1.3:1.0/input/input1
generic-usb 0003:04B4:0100.0002: input: USB HID v1.00 Keyboard [TechScan Korea DG Dashuo USB-V4.0 ] on usb-ssb0:1-1.3/input0

root@OpenWrt:/# lsusb
Bus 001 Device 001: ID 1d6b:0001
Bus 002 Device 001: ID 1d6b:0002
Bus 001 Device 002: ID 0a05:7211
Bus 001 Device 003: ID 0951:1603
Bus 001 Device 004: ID 04b4:0100

Wie wir sehen können, es wurde eine neue Einrichtung TechScan Korea с ID 04b4:0100 Cypress Semiconductor Corp erkennt.

Es ist auch wichtig zu beachten, dass eine neue Einrichtung im Verzeichnis /dev erstellt wurde:

root@OpenWrt:/# ls -l /dev/input/
crw-r--r-- 1 root root 13, 64 Jan 1 00:01 event0

Es wurde auch eine Datei dieser Einrichtung im Verzeichnis /proc erstellt:

root@OpenWrt:/# cat /proc/bus/input/devices
I: Bus=0003 Vendor=04b4 Product=0100 Version=0100
N: Name="TechScan Korea DG Dashuo USB-V4.0 "
P: Phys=usb-ssb0:1-1.3/input0
S: Sysfs=/devices/ssb0:1/usb1/1-1/1-1.3/1-1.3:1.0/input/input2
U: Uniq=
H: Handlers=event0
B: EV=120013
B: KEY=e080ffdf 1cfffff ffffffff fffffffe
B: MSC=10
B: LED=1f

Was kommt weiter? Anscheinend gibt es keine Anwendungen für die Arbeit mit dem Bar-Kode Scanner in OpenWrt. Deshalb habe ich wie immer versucht ein Fertigprodukt im Internet zu finden. Da aber ich die Spezifik dieses Gebietes nicht kenne, konnte ich keine gescheitere Informationen finden und hatte selber etwas zu schreiben. Hier werden wir über ein Testprogramm sprechen, dessen Zweck ist die Bar-Kode vom Scanner zu erkennen.

Soviel ich verstehe, ist die Einrichtung /dev/input/event0, welche im Verzeichnis /dev erstellt wurde, eine Eingabeeinrichtung wie eine Tastatur. Deshalb haben wir nur die Bar-Kode, welche von der Einrichtung /dev/input/event0 beim Datenverfügbarkeit zurückgegeben werden, zu erkennen.

Wollen wir ein Testprogramm, welches gerade dies macht, schreiben. Die fertige Datei kann von hier entnommen werden.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/input.h>


#define KEY_PRESS 1
#define KEY_KEEPING_PRESSED 2

int main (int argc, char *argv[])
{
struct input_event ev[64];
int fd, rd,size = sizeof (struct input_event);
char name[256] = "Unknown",i;
char *device = NULL;
char decode_scancode[]={0,0,1,2,3,4,5,6,7,8,9,0};

if (argv[1] == NULL){
printf("Please enter path to device\n");
return 1;
}

if ((getuid ()) != 0)
printf ("You must be as root for correct work!\n");

if (argc > 1)
device = argv[1];

if ((fd = open (device, O_RDONLY)) == -1){
printf ("Open error of device %s\n", device);
return 1;
}

ioctl (fd, EVIOCGNAME (sizeof (name)), name);
printf ("Reading From : %s (%s)\n", device, name);

while (1){
if ((rd = read (fd, ev, size * 64)) < size){
perror ("Read error");
return 1;
}

for (i=0; i< ((int)(rd/size)); i++) {
if (ev[i].type == EV_KEY) {
if ((ev[i].value == KEY_PRESS) || (ev[i].value == KEY_KEEPING_PRESSED)) {
if (ev[i].code < 12) {
printf ("%d", (decode_scancode[ev[i].code]));
}
else if (ev[i].code == 28) {
printf ("\n");
}
}
}
}
}

return 0;
}

Das Programm wird mittels eines Kreuz-Compilers zusammengebaut.Wie dies zu machen ist, wurde früher beschrieben.

Kopieren wir die ausführbare Datei barcode in das Dateisystem und prüfen, wie diese Datei funktioniert. Beim Starten ist die Einrichtung für die Datenlesung anzugeben. Nach dem Starten bringen wir die Strichcode zu dem Scanner heran und drücken die Taste. Bei mir sieht es wie folgt aus:

root@OpenWrt:/# /home/barcode /dev/input/event0
Reading From : /dev/input/event0 (TechScan Korea DG Dashuo USB-V4.0 )
4810151007577
4600717035256
2000061957969

Vergleichen wir diese Ziffern mit denen, welche auf der Barkode angegeben sind. Wenn diese zusammenstimmen, dann:

Bestellen Sie einen Bar-Kode Scanner bei uns:

Usb cканер штрихкода