Biblio-RFID
view release on metacpan or search on metacpan
lib/Biblio/RFID/Reader/3M810.pm view on Meta::CPAN
package Biblio::RFID::Reader::3M810;
=head1 NAME
Biblio::RFID::Reader::3M810 - support for 3M 810 RFID reader
=head1 DESCRIPTION
This module uses L<Biblio::RFID::Reader::Serial> over USB/serial adapter
with 3M 810 RFID reader, often used in library applications.
This is most mature implementation which supports full API defined
in L<Biblio::RFID::Reader::API>. This include scanning for all tags in reader
range, reading and writing of data, and AFI security manipulation.
This implementation is developed using Portmon on Windows to capture serial traffic
L<http://technet.microsoft.com/en-us/sysinternals/bb896644.aspx>
Checksum for this reader is developed using help from C<selwyn>
L<http://stackoverflow.com/questions/149617/how-could-i-guess-a-checksum-algorithm>
More inforation about process of reverse engeeniring protocol with
this reader is available at L<http://blog.rot13.org/rfid/>
=cut
use warnings;
use strict;
use base 'Biblio::RFID::Reader::Serial';
use Biblio::RFID;
use Data::Dump qw(dump);
use Carp qw(confess);
use Time::HiRes;
use Digest::CRC;
sub serial_settings {{
baudrate => "19200",
databits => "8",
parity => "none",
stopbits => "1",
handshake => "none",
}}
sub assert;
my $port;
sub init {
my $self = shift;
$port = $self->port;
# disable timeouts
$port->read_char_time(0);
$port->read_const_time(0);
# drain on startup
my ( $count, $str ) = $port->read(3);
if ( $count ) {
my $data = $port->read( ord(substr($str,2,1)) );
warn "drain ",as_hex( $str, $data ),"\n";
}
$port->read_char_time(100); # 0.1 s char timeout
$port->read_const_time(500); # 0.5 s read timeout
$port->write( hex2bytes( 'D5 00 05 04 00 11 8C66' ) );
# hw-version expect: 'D5 00 09 04 00 11 0A 05 00 02 7250'
my $data = $port->read( 12 );
return unless $data;
warn "# probe response: ",as_hex($data);
if ( my $rest = assert $data => 'D5 00 09 04 00 11' ) {
my $hw_ver = join('.', unpack('CCCC', $rest));
warn "# 3M 810 hardware version $hw_ver\n";
cmd(
'13 04 01 00 02 00 03 00 04 00','FIXME: stats? rf-on?', sub { assert(shift,
'13 00 02 01 01 03 02 02 03 00'
)});
( run in 1.537 second using v1.01-cache-2.11-cpan-ff9377addf4 )