From: Dobrica Pavlinusic Date: Tue, 27 Jul 2010 13:08:25 +0000 (+0200) Subject: JSONP server for RFID reader X-Git-Tag: RFID-Biblio-0.02~142 X-Git-Url: http://git.rot13.org/?p=Biblio-RFID.git;a=commitdiff_plain;h=1aeb7180acb209199a37e20d17e45f5b31acab86;hp=cd764216685e9752593d98d554d0c66b45cd3314 JSONP server for RFID reader --- diff --git a/scripts/RFID-JSONP-server.pl b/scripts/RFID-JSONP-server.pl new file mode 100755 index 0000000..9f1e3d6 --- /dev/null +++ b/scripts/RFID-JSONP-server.pl @@ -0,0 +1,242 @@ +#!/usr/bin/perl + +=head1 RFID-JSONP-server + +This is simpliest possible JSONP server which provides local web interface to RFID readers + +Usage: + + ./scripts/RFID-JSONP-server.pl + +=cut + +use strict; +use warnings; + +use Data::Dump qw/dump/; + +use JSON; +use IO::Socket::INET; + +my $debug = 1; + +my $listen_port = 9000; # pick something not in use +my $server_url = "http://localhost:$listen_port"; + + +use lib 'lib'; +use RFID::Serial::3M810; +my $rfid = RFID::Serial::3M810->new; + +sub http_server { + + my $server = IO::Socket::INET->new( + Proto => 'tcp', + LocalPort => $listen_port, + Listen => SOMAXCONN, + Reuse => 1 + ); + + die "can't setup server: $!" unless $server; + + print "Server $0 ready at $server_url\n"; + + sub static { + my ($client,$path) = @_; + + return unless $path eq '/'; + + print $client "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"; + while() { + print $client $_; + } + + return $path; + } + + while (my $client = $server->accept()) { + $client->autoflush(1); + my $request = <$client>; + + warn "WEB << $request\n" if $debug; + + if ($request =~ m{^GET (/.*) HTTP/1.[01]}) { + my $method = $1; + my $param; + if ( $method =~ s{\?(.+)}{} ) { + foreach my $p ( split(/[&;]/, $1) ) { + my ($n,$v) = split(/=/, $p, 2); + $param->{$n} = $v; + } + warn "WEB << param: ",dump( $param ) if $debug; + } + if ( my $path = static( $client,$1 ) ) { + warn "WEB >> $path" if $debug; + } elsif ( $method =~ m{/scan} ) { + my $tags = $rfid->scan; + my $json = { + time => time(), + tags => $tags, + }; + print $client "HTTP/1.0 200 OK\r\nContent-Type: application/json\r\n\r\n", + $param->{callback}, "(", to_json($json), ")\r\n"; + } elsif ( $method =~ m{/program} ) { + + my $status = 501; # Not implementd + + foreach my $p ( keys %$param ) { + next unless $p =~ m/^(E[0-9A-F]{15})$/; + my $tag = $1; + my $content = "\x04\x11\x00\x01" . $param->{$p}; + $content = "\x00" if $param->{$p} eq 'blank'; + $status = 302; + + warn "PROGRAM $tag $content\n"; + write_tag( $tag, $content ); + secure_tag_with( $tag, $param->{$p} =~ /^130/ ? 'DA' : 'D7' ); + } + + print $client "HTTP/1.0 $status $method\r\nLocation: $server_url\r\n\r\n"; + + } elsif ( $method =~ m{/secure(.js)} ) { + + my $json = $1; + + my $status = 501; # Not implementd + + foreach my $p ( keys %$param ) { + next unless $p =~ m/^(E[0-9A-F]{15})$/; + my $tag = $1; + my $data = $param->{$p}; + $status = 302; + + warn "SECURE $tag $data\n"; + secure_tag_with( $tag, $data ); + } + + if ( $json ) { + print $client "HTTP/1.0 200 OK\r\nContent-Type: application/json\r\n\r\n", + $param->{callback}, "({ ok: 1 })\r\n"; + } else { + print $client "HTTP/1.0 $status $method\r\nLocation: $server_url\r\n\r\n"; + } + + } else { + print $client "HTTP/1.0 404 Unkown method\r\n\r\n"; + } + } else { + print $client "HTTP/1.0 500 No method\r\n\r\n"; + } + close $client; + } + + die "server died"; +} + +http_server; + +__DATA__ + + +3M RFID + + + + + + +

RFID tags in range

+ + + +
+RFID reader not found or driver program not started. +
+ + +