RFID_LISTEN=host:port to listen for TCP socket from reader
[Biblio-RFID.git] / lib / Biblio / RFID / Reader / Serial.pm
index f954f39..b97be50 100644 (file)
@@ -4,11 +4,12 @@ use warnings;
 use strict;
 
 use Device::SerialPort qw(:STAT);
+use Biblio::RFID::Reader::INET;
 use Data::Dump qw(dump);
 
 =head1 NAME
 
-Biblio::RFID::Reader::Serial - base class for serial RFID readers
+Biblio::RFID::Reader::Serial - base class for serial or serial over TCP RFID readers
 
 =head1 METHODS
 
@@ -35,6 +36,9 @@ Tries to open usb serial ports C</dev/ttyUSB*> and serial ports C</dev/ttyS*>
 
 To try just one device use C<RFID_DEVICE=/dev/ttyUSB1> enviroment variable
 
+If you want to define serial connection over TCP socket, you have to export
+enviroment variable C<RFID_TCP=hostname:port>.
+
 =cut
 
 our $serial_device;
@@ -42,8 +46,44 @@ our $serial_device;
 sub port {
        my $self = shift;
 
+       warn "## port ",dump( $self->{port} );
+
        return $self->{port} if defined $self->{port};
 
+       if ( my $tcp = $ENV{RFID_TCP} ) {
+               my $port = Biblio::RFID::Reader::INET->new(
+                       PeerAddr => $tcp,
+                       Proto    => 'tcp'
+               );
+               warn "## TCP $tcp ", ref($port);
+               $self->{port} = $port;
+               $self->init;
+               return $port;
+       }
+
+       if ( my $listen = $ENV{RFID_LISTEN} ) {
+               my $server = Biblio::RFID::Reader::INET->new(
+                       Proto     => 'tcp',
+                       LocalAddr => $listen,
+                       Listen    => SOMAXCONN,
+                       Reuse     => 1
+               );
+                                                                         
+               die "can't setup server $listen: $!" unless $server;
+
+               warn "RFID: waiting for reader connection to $listen";
+
+               my $port = $server->accept();
+               $port->autoflush(1);
+
+               warn "## LISTEN $listen ", ref($port);
+               $self->{port} = $port;
+               $self->init;
+
+               return $port;
+
+       }
+
        my $settings = $self->serial_settings;
        my @devices  = $ENV{RFID_DEVICE} ? ( $ENV{RFID_DEVICE} ) : glob '/dev/ttyUSB* /dev/ttyS*';
        warn "# port devices ",dump(@devices);