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 )