7 our @EXPORT = qw( hex2bytes as_hex hex_tag );
9 use Device::SerialPort qw(:STAT);
10 use Data::Dump qw(dump);
14 RFID::Biblio - easy to use API for writing RFID enabled appliaction
18 our $VERSION = '0.02';
25 This module tries to support USB serial RFID readers wsing simple API
26 which is sutable for direct mapping to REST JSONP service.
28 Perhaps a little code snippet.
32 my $rfid = RFID::Biblio->new(
33 device => '/dev/ttyUSB0', # with fallback to RFID_DEVICE
36 # invetory tags in reader range and read data from them
37 my $visible = $rfid->scan;
43 Open serial port (if needed) and init reader
54 $self->init && return $self;
59 my $serial_obj = $self->port;
66 return $self->{port} if defined $self->{port};
68 my $settings = $self->serial_settings;
69 my $device = $settings->{device} ||= $ENV{RFID_DEVICE};
70 warn "# settings ",dump $settings;
73 warn "# no device, serial port not opened\n";
77 $self->{port} = Device::SerialPort->new( $settings->{device} )
78 || die "can't open serial port: $!\n";
80 $self->{port}->$_( $settings->{$_} )
81 foreach ( qw/handshake baudrate databits parity stopbits/ );
87 my $visible = $rfid->scan;
89 Returns hash with keys which match tag UID and values with blocks
96 warn "# scan tags in reader range\n";
97 my @tags = $self->inventory;
100 # FIXME this is naive implementation which just discards other tags
101 foreach my $tag ( @tags ) {
102 my $blocks = $self->read_blocks( $tag );
104 warn "ERROR: can't read tag $tag\n";
105 delete $visible->{$tag};
107 $visible->{$tag} = $blocks->{$tag};
115 =head1 READER IMPLEMENTATION
117 Each reader must implement following hooks as sub-classes.
125 my @tags = $self->invetory;
129 my $hash = $self->read_blocks( $tag );
131 All blocks are under key which is tag UID with array of blocks returned from reader
133 $hash = { 'E000000123456789' => [ 'blk1', 'blk2', ... ] };
135 L<RFID::Biblio::Reader::3M810> sends tag UID with data payload, so we might expect
136 to receive response from other tags from protocol specification,
140 $self->write_blocks( $tag => $bytes );
142 $self->write_blocks( $tag => [ 'blk1', 'blk2', ... ] );
146 my $afi = $self->read_afi( $tag );
150 $self->write_afi( $tag => $afi );
156 Formatting functions are exported
160 my $bytes = hex2bytes($hex);
165 my $str = shift || die "no str?";
168 $b =~ s/(..)/\\x$1/g;
172 warn "## str2bytes( $str ) => $b => ",as_hex($bytes) if $debug;
178 print as_hex( $bytes );
184 foreach my $str ( @_ ) {
185 my $hex = uc unpack( 'H*', $str );
186 $hex =~ s/(..)/$1 /g if length( $str ) > 2;
190 return join(' | ', @out);
195 print hex_tag $8bytes;
199 sub hex_tag { uc(unpack('H16', shift)) }
202 =head1 SUPPORTED READERS
204 Support for different RFID readers is implemented in subclasses:
208 L<RFID::Biblio::Reader::3M810>
212 L<RFID::Biblio::Reader::CPRM02>
216 L<RFID::Biblio::Reader::librfid>
220 Dobrica Pavlinusic, C<< <dpavlin at rot13.org> >>
224 Please report any bugs or feature requests to C<bug-rfid-serial at rt.cpan.org>, or through
225 the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=RFID-Biblio>. I will be notified, and then you'll
226 automatically be notified of progress on your bug as I make changes.
233 You can find documentation for this module with the perldoc command.
238 You can also look for information at:
242 =item * RT: CPAN's request tracker
244 L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=RFID-Biblio>
246 =item * AnnoCPAN: Annotated CPAN documentation
248 L<http://annocpan.org/dist/RFID-Biblio>
252 L<http://cpanratings.perl.org/d/RFID-Biblio>
256 L<http://search.cpan.org/dist/RFID-Biblio/>
261 =head1 ACKNOWLEDGEMENTS
264 =head1 LICENSE AND COPYRIGHT
266 Copyright 2010 Dobrica Pavlinusic.
268 This program is free software; you can redistribute it and/or modify
269 it under the terms of the GNU General Public License as published by
270 the Free Software Foundation; version 2 dated June, 1991 or at your option
273 This program is distributed in the hope that it will be useful,
274 but WITHOUT ANY WARRANTY; without even the implied warranty of
275 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
276 GNU General Public License for more details.
278 A copy of the GNU General Public License is available in the source tree;
279 if not, write to the Free Software Foundation, Inc.,
280 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
285 1; # End of RFID::Biblio