projects
/
Biblio-RFID.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
kill TERM pipe program on timeout
[Biblio-RFID.git]
/
lib
/
Biblio
/
RFID
/
Reader
/
librfid.pm
diff --git
a/lib/Biblio/RFID/Reader/librfid.pm
b/lib/Biblio/RFID/Reader/librfid.pm
index
ebb45b9
..
8f6a96d
100644
(file)
--- a/
lib/Biblio/RFID/Reader/librfid.pm
+++ b/
lib/Biblio/RFID/Reader/librfid.pm
@@
-22,6
+22,10
@@
Due to limitation of L<librfid-tool> only
L<Biblio::RFID::Reader::API/inventory> and
L<Biblio::RFID::Reader::API/read_blocks> is supported.
L<Biblio::RFID::Reader::API/inventory> and
L<Biblio::RFID::Reader::API/read_blocks> is supported.
+This version uses modidified C<librfid-tool> which supports
+new C<-s> flag which reads sectors 0-3 with C<-k> key and
+sectors 4-7 with key from C<-s> option.
+
However, this code might provide template for integration
with any command-line utilities for different RFID readers.
However, this code might provide template for integration
with any command-line utilities for different RFID readers.
@@
-40,8
+44,20
@@
sub init { 1 }
sub _grep_tool {
my ( $bin, $param, $coderef, $path ) = @_;
sub _grep_tool {
my ( $bin, $param, $coderef, $path ) = @_;
+ my $timeout = 3; # s
+
+ eval {
+
warn "# _grep_tool $bin $param\n";
warn "# _grep_tool $bin $param\n";
- open(my $s, '-|', "$bin $param") || die $!;
+# $param .= ' 2>/dev/null';
+ my $pipe_pid = open(my $s, '-|', "$bin $param") || die $!;
+
+ local $SIG{ALRM} = sub {
+ warn "TIMEOUT!";
+ kill TERM => $pipe_pid;
+ die "timeout\n"
+ };
+ alarm $timeout;
my $sid;
my $iso;
my $sid;
my $iso;
@@
-61,6
+77,21
@@
sub _grep_tool {
$coderef->( $sid, $iso );
}
$coderef->( $sid, $iso );
}
+ alarm(0);
+ close($s);
+
+ }; # eval
+
+ if ( $? >> 8 || $@ ) {
+ my $lsusb = `lsusb -d 076b:`;
+ if ( $lsusb =~ m/\S+\s+(\d+)\s+\S+\s+(\d+)/ ) {
+ my $cmd = "usbreset /dev/bus/usb/$1/$2";
+ warn "# $cmd\n";
+ system $cmd;
+ } else {
+ warn "can't reset device $lsusb";
+ }
+ }
}
}
@@
-69,10
+100,11
@@
my $sid_iso;
sub inventory {
my @tags;
sub inventory {
my @tags;
+ $sid_iso = {};
_grep_tool 'librfid-tool', '--scan' => sub {
my ( $sid, $iso ) = @_;
_grep_tool 'librfid-tool', '--scan' => sub {
my ( $sid, $iso ) = @_;
- if ( $sid ) {
- push @tags, $sid
unless defined $sid_iso->{$sid}
;
+ if ( $sid
&& ! exists $sid_iso->{$sid}
) {
+ push @tags, $sid;
$sid_iso->{$sid} = $iso;
}
};
$sid_iso->{$sid} = $iso;
}
};
@@
-80,6
+112,11
@@
sub inventory {
return @tags;
}
return @tags;
}
+sub tag_type {
+ my ( $self, $tag ) = @_;
+ return $sid_iso->{$tag} =~ m/15693/ ? 'RFID501' : 'SmartX';
+}
+
our $mifare_keys;
sub read_mifare_keys {
my $key_path = $0;
our $mifare_keys;
sub read_mifare_keys {
my $key_path = $0;
@@
-108,6
+145,7
@@
sub read_blocks {
} else {
read_mifare_keys unless $mifare_keys;
} else {
read_mifare_keys unless $mifare_keys;
+=for unmodified mifate-tool
foreach my $sector ( keys %$mifare_keys ) {
my $key = lc $mifare_keys->{$sector};
_grep_tool 'mifare-tool', "-k $key -r $sector" => sub {
foreach my $sector ( keys %$mifare_keys ) {
my $key = lc $mifare_keys->{$sector};
_grep_tool 'mifare-tool', "-k $key -r $sector" => sub {
@@
-115,6
+153,11
@@
sub read_blocks {
if m/data=\s*(.+)/;
};
}
if m/data=\s*(.+)/;
};
}
+=cut
+ _grep_tool 'mifare-tool', "-k " . $mifare_keys->{0} . " -s " . $mifare_keys->{4} => sub {
+ $blocks->{$sid}->[$1] = hex2bytes($2)
+ if m/page=(\d+).*data=\s*(.+)/;
+ };
}
warn "# read_blocks ",dump($blocks);
return $blocks;
}
warn "# read_blocks ",dump($blocks);
return $blocks;