SmartX decode format
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sun, 2 Feb 2014 21:52:25 +0000 (16:52 -0500)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sun, 2 Feb 2014 21:52:25 +0000 (16:52 -0500)
lib/Biblio/RFID/SmartX.pm [new file with mode: 0644]
t/06-SmartX.t [new file with mode: 0755]

diff --git a/lib/Biblio/RFID/SmartX.pm b/lib/Biblio/RFID/SmartX.pm
new file mode 100644 (file)
index 0000000..1d3649d
--- /dev/null
@@ -0,0 +1,55 @@
+package Biblio::RFID::SmartX;
+
+use warnings;
+use strict;
+
+use Data::Dump qw(dump);
+
+=head1 NAME
+
+Biblio::RFID::SmartX - Croatian student cards format
+
+=back
+
+
+=head1 METHODS
+
+=head2 to_hash
+
+  my $hash = Biblio::RFID::Decode::SmartX->to_hash( [ 'sector1', 'sector2', ... , 'sector7' ] );
+
+=cut
+
+sub bcd {
+       my $data = shift;
+       return join('', map { sprintf("%02x",ord($_)) } split (//, $data));
+}
+
+sub to_hash {
+       my ( $self, $data ) = @_;
+
+       return unless $data;
+
+       die "expecting array of sectors" unless ref $data eq 'ARRAY';
+
+       my $decoded;
+       foreach ( 4 .. 6 ) {
+               warn "# $_: ",
+               $decoded->[$_] = bcd( $data->[$_] );
+       }
+
+       my $hash;
+       $hash->{SXID}    = substr( $decoded->[4], 0,  20 );
+       $hash->{JMBAG}   = substr( $decoded->[4], 22, 10 );
+       $hash->{OIB}     = substr( $decoded->[5], 16, 11 );
+       $hash->{SPOL}    = substr( $data->[5], 14, 1 ); # char, not BCD!
+       $hash->{INST_ID} = substr( $decoded->[6], 0, 12 );
+       $hash->{CARD_V}  = substr( $decoded->[6], 12, 4  );
+
+       warn "## hash = ",dump($hash);
+
+       return $hash;
+
+}
+
+1;
diff --git a/t/06-SmartX.t b/t/06-SmartX.t
new file mode 100755 (executable)
index 0000000..798399c
--- /dev/null
@@ -0,0 +1,37 @@
+#!/usr/bin/perl
+
+use Test::More tests => 2;
+use Data::Dump qw(dump);
+
+use lib 'lib';
+
+BEGIN {
+       use_ok( 'Biblio::RFID::SmartX' );
+}
+
+my $tags =
+[ [
+       "\xde\xad\xbe\xbe\xfc\x38\x02\x00\x00\x00\x00\x00\x21\x07\x44\x00",
+       "\x00\x01\x1d\x58\x1e\x58\x1f\x58\x29\x58\x00\x00\x00\x00\x00\x00",
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+       undef,
+       "\x99\x88\x77\x66\x55\x44\x33\x22\x11\x00\x00\x12\x22\x22\x22\x21",
+       "\x32\x30\x31\x33\x34\x35\x36\x31\x91\x11\x11\x11\x11\x90\x6d\x00",
+       "\x33\x33\x33\x00\x00\x00\x00\x06\x00\x30\x32\x53\x52\x43\x45\x04",
+],[
+       "\x01\x02\x03\x04\xdc\x38\x02\x00\x00\x00\x00\x00\x21\x07\x44\x00",
+       "\x00\x01\x1d\x58\x1e\x58\x1f\x58\x29\x58\x00\x00\x00\x00\x00\x00",
+       "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
+       undef,
+       "\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\x00\x21\x11\x11\x11\x12",
+       "\x32\x30\x31\x34\x31\x30\x30\x31\x81\x11\x11\x11\x11\x80\x66\x00",
+       "\x32\x32\x32\x00\x00\x00\x00\x05\x00\x30\x32\x53\x52\x43\x45\x04",
+] ];
+
+foreach my $tag ( @$tags ) {
+
+       ok( $hash = Biblio::RFID::SmartX->to_hash( $tag ), 'to_hash' );
+       diag dump $hash;
+
+}
+