2010-10-06 4 views
1

D'accord, certains d'entre vous ont peut-être remarqué que je travaillais sur ce problème depuis environ 3 semaines. Je ne peux pas comprendre pour la vie de moi ce qui se passe .. Ci-dessous le script Perl qui enregistre les entrées du lecteur de carte USB qui agit comme un clavier. La machine est un système embarqué fonctionnant à partir d'un lecteur flash compact, utilisant le voyage linux.entrée de script linux et perl

use strict; 
use Time::Local; 

open(MATCH,'swipe_match.txt'); 
my @matches = <MATCH>; 
close(MATCH); 

my $error = qr/[+%;]E\?/; 

while(1) { 
     my $text = <STDIN>; 
     my $text1 = <STDIN>; 
     my $text2 = <STDIN>; 
     if (($text && $text1 && $text2) or ($text && $text1) or $text) { 
       my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = localtime(); $year += 1900; 
       $mon+=1; 
       my $timestamp = "$mon/$mday/$year $hour:$min:$sec"; 
       chomp $text; 
     chomp $text1; 
     chomp $text2; 

#    my $matched = 0; 
#    foreach my $test (@matches) { 
#      chomp $test; 
#      $matched = 1 if ($text =~ /$test/i); 
#    } 
#    if ($matched) { 
#      system("aplay /SWIPE/good.wav >/dev/null 2>/dev/null"); 
#    } else { 
#      system("aplay /SWIPE/bad.wav >/dev/null 2>/dev/null"); 
#    } 

     # write out the swipe even if its bad... 
     open(LOG,'>>/DATA/SWIPES.TXT'); 
     print LOG $text."\t".$text1."\t".$text2."\t".$timestamp."\n"; 
     close(LOG); 

     if ($text =~ $error or $text1 =~ $error or $text2 =~ $error) { 
         system("aplay /SWIPE/bad.wav >/dev/null 2>/dev/null"); 
     } 
     else { 
         system("aplay /SWIPE/good.wav >/dev/null 2>/dev/null"); 
     } 
     } 
} 
exit; 

Je n'ai pas écrit ce script, et la personne qui l'a écrit est partie depuis longtemps. Actuellement, j'ai 2 machines. L'un travaille et l'autre est celui qui essaie de se mettre au travail. Im essayant de comprendre comment ce script obtient l'entrée (sur la machine qui fonctionne). Je peux ouvrir le fichier journal /DATA/SWIPES.TXT et voir les balayages réels. Actuellement, il n'y a pas de processus en cours d'exécution sur la machine qui affecterait le script, voici les processus:

PID TTY  STAT TIME COMMAND 
    1 ?  Ss  0:29 init [2] 
    2 ?  S<  0:00 [kthreadd] 
    3 ?  S<  0:04 [ksoftirqd/0] 
    4 ?  S<  3:21 [events/0] 
    5 ?  S<  0:00 [khelper] 
    44 ?  S<  0:00 [kblockd/0] 
    46 ?  S<  0:00 [kacpid] 
    47 ?  S<  0:00 [kacpi_notify] 
    94 ?  S<  0:00 [kseriod] 
    134 ?  S  0:00 [pdflush] 
    135 ?  S  0:06 [pdflush] 
    136 ?  S<  0:00 [kswapd0] 
    137 ?  S<  0:00 [aio/0] 
    138 ?  S<  0:00 [nfsiod] 
    795 ?  S<  0:00 [kpsmoused] 
    800 ?  S<  0:00 [rpciod/0] 
1627 ?  S<  0:00 [ksuspend_usbd] 
1631 ?  S<  0:00 [khubd] 
1646 ?  S<  0:00 [ata/0] 
1648 ?  S<  0:00 [ata_aux] 
1794 ?  S<s 0:00 udevd --daemon 
2913 ?  Ss  0:00 pump -i eth0 
2979 ?  Ss  0:00 /usr/sbin/rpc.idmapd 
3060 ?  S  0:01 /usr/sbin/syslogd --no-forward 
3083 ?  Ss  0:00 /usr/sbin/sshd 
3099 ?  S  0:00 /usr/sbin/inetutils-inetd 
3122 ?  Ss  0:00 /usr/sbin/pptpd 
3138 ?  Ss  0:00 /usr/sbin/cron 
3149 ?  SLs 0:33 /usr/sbin/watchdog 
3167 tty2  Ss+ 0:00 /sbin/mingetty tty2 
3169 tty3  Ss+ 0:00 /sbin/rungetty tty3 
3170 tty4  Ss+ 0:00 /sbin/rungetty tty4 
3173 tty5  Ss+ 0:00 /sbin/getty 38400 tty5 
3175 tty6  Ss+ 0:00 /sbin/getty 38400 tty6 
15677 ?  Ss  0:00 sshd: [email protected]/0 
15679 pts/0 Ss  0:00 -bash 
15710 ?  Z  0:00 [watchdog] <defunct> 
15711 pts/0 R+  0:00 ps x 

Ainsi, à partir de là, je ne sais pas où aller. Quelqu'un peut-il me donner des suggestions ou des conseils sur la façon dont ce script reçoit réellement l'entrée du lecteur USB. Aussi, il reçoit comment l'entrée sans être connecté. La machine est une machine intégrée, je l'allume, et il accepte les balayages et les enregistre, en utilisant le script perl.

Répondre

0

Les bits clés sont ici:

while(1) { 
    my $text = <STDIN>; 

Le lecteur de carte USB est configuré pour diriger son entrée à STDIN, car il agit comme un clavier. Quand il a fini de lire une carte, il envoie un retour chariot. L '"entrée" est alors lue par Perl et coincée dans $text, puis elle attend le prochain balayage. Une fois que trois balayages sont effectués (les trois lignes <STDIN>), il traite l'information et l'écrit dans le fichier. Ensuite, puisque vous êtes dans une boucle while(1), il revient simplement en haut de la boucle et attend plus de données.

Vous pouvez simuler cela sur un autre ordinateur en exécutant le programme, puis en attendant la saisie, tapez du texte et terminez-le avec la touche Entrée. Faites-le trois fois pour simuler les trois balayages, et le programme devrait le traiter.

+0

oui mais programme ne fonctionne pas sur la machine? Il ne fonctionnerait pas non plus au premier plan. –

0

Le script lit à partir de stdin, vous devez donc trouver où/qui appelle ce script et voir ce qui se passe sur stdin.

Avez-vous vérifié les tâches cron du système? Vous pouvez trouver un indice en regardant l'horodatage et la propriété du fichier /DATA/SWIPES.TXT.

Questions connexes