2009-05-13 3 views
1

Я работаю над проектом для своей компании, который использует сервер сокетов (php) для сбора данных с удаленного устройства. Как я могу заставить эту программу perl запускаться непосредственно в потоке, а не сначала записывать сервер в файл tmp, а затем запускать этот скрипт в этом файле, а затем записывать файл csv для вставки в базу данных?Нужна помощь в анализе данных потока с сервера php socket с помощью perl

Я думал об использовании IO :: Socket, но я не уверен, как это сделать.

Также, если у кого есть какие-либо советы/указатели на то, как очистить этот код, это будет оценено. (Я до сих пор очень много Perl n00b ;-))

Вот что я до сих пор для PERL прог (я ветер с двумя TMP файлов после этого запускается).


#vim set sw=2 ts=2 
#!/usr/bin/perl 
use warnings; 
use strict; 
use Data::Dumper; 
&convert; 

#open the source file, strip out any unneeded chars, reformat the data 
sub convert{ 
    my $source = "$ARGV[0]"; 
    my $dest = "$ARGV[0]"."_tmp.txt"; 
    chomp $source; 
    open SOURCE, '', $dest or die "Could not open '$dest' $!"; 

    # move the data from the source file into an array 
    my %fields; 
    my @field_names = qw/FIELD1 FIELD2 FIELD3 FIELD4 FIELD5 FIELD6/; 
    my $pack_definition = 'a4 a2 a1 a4 a4 a8A*'; 
    while(){ 

     # strip out the packet header 
     s#T18##g; 
     s#T00##g; 
     s/^(FF14).*$//g; 
     s/^(FF18).*$//g; 
     s/(^|\n)[\n\s]*/$1/g; 

     # arrange the data into the necessary order 
     @fields{@field_names} = unpack($pack_definition, $_); 
     s#(FF15)(.{2})(.{1})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})#$1\t$2\t$3\t$5$4\t$7$6\t$11$10$9$8#g; 
     s#(FF16)(.{2})(.{1})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})#$1\t$2\t$3\t$4\t$5\t$6\t$7\t$8\t$9\t$10\t$11#g; 
     s#(FF17)(.{2})(.{1})(.{2})(.{2})(.{2})(.{2})(.{4})(.{4})#$1\t$2\t$3\t$5$4\t$7$6\t$8\t$9#g; 
     my @spds = /(FF15)\t(.{2})\t(.{1})\t(.{4})\t(.{4})\t(.{8})/; 

     # convert the data from hex to ascii 
     foreach my $data (@spds){ 
      my $replacement = hex($data); 
      s#$data#$replacement#g; 
     } 
     my @psis = /(FF16)\t(.{2})\t(.{1})\t(.{2})\t(.{2})\t(.{2})\t(.{2})\t(.{2})\t(.{2})\t(.{2})\t(.{2})/; 
     foreach my $data1(@psis){ 
      my $replacement1 = hex($data1); 
      s#$data1#$replacement1#g; 
     } 
     my @rates= /(FF17)\t(.{2})\t(.{1})\t(.{4})\t(.{1,4})\t(.{4})\t(.{4})/; 
     foreach my $data2 (@rates){ 
      my $replacement2 = hex($data2); 
      s#$data2#$replacement2#g; 
     } 

     # print the converted data to the destination file 
     print DEST; 
    } 
    # close the files 
    close SOURCE; 
    close DEST; 
} 
&create_vals; 

# perform conversion from raw values to human readable output 
sub create_vals{  
    my $source = "$ARGV[0]"."_tmp.txt"; 
    my $dest = "$ARGV[0]"."_converted.txt"; 
    chomp $source; 
    open SOURCE, '', $dest or die "Cannot open '$dest' for writing $!"; 
    while(){ 
     s#(65301)\t(.{2})\t(8)\t(.{1,5})\t(.{1,5})\t(.{1,4})#"'".$1."','". $2."','". $3."','". ($4/8)."','". ($5/8)."','". ($6/20)."'"#eg; 
     s#(65302)\t(.{2})\t(8)\t(.{1,3})\t(.{1,3})\t(.{1,3})\t(.{1,3})\t(.{1,3})\t(.{1,3})\t(.{1,3})\t(.{1,3})#"'".$1."','". $2."','". $3."','". $4."','". (($5*1.8)-40)."','". (($6*1.8)-40)."','". ($7*.58)."','".($8*.58)."','".($9*.29008)."','".(($10*1.8)-40)."','".$11."'"#eg; 
     s#(65303)\t(.{2})\t(8)\t(.{1,5})\t(.{1,5})\t(.{1,5})\t(.{1,5})#"'".$1."','". $2."','". $3."','". ($4*0.014)."','". ($5*.05)."'"#eg; 
     print DEST; 
    } 
} 
    close SOURCE; 
    close DEST; 
__END__ 

ответ

1

Если «запустить прямо в потоке» означает «принимать соединения с удаленного устройства вместо сервера PHP», тогда IO :: Socket - это способ пойти. У Google есть plenty of examples, и вы также можете ознакомиться с документацией perlipc.

+0

Я бы предпочел оставить приложение сервера отдельно. Я думал о том, есть ли способ запустить это на данных, не имея необходимости писать так много временных файлов (т. Е. Данные поступают на сервер -> сервер записывает данные в blah.txt -> программа perl открывает blah.txt run & convert затем записывает данные в blah_tmp.txt ->, затем запускает и создает_валюты и записывает данные в -> blah_converted.txt.) Если бы я мог просто сохранить его, чтобы он работал с данными до того, как сервер запишет его в файл temp, данных в db, что было бы здорово. – bsisco

+0

Если вы можете изменить серверное приложение, вы можете попробовать вызвать Perl-скрипт из PHP, как описано в http://devzone.zend.com/article/1712. Другим подходом может быть передача данных на ваш скрипт Perl через канал, другой сокет, базу данных и т. Д. Кстати, в вашей существующей цепочке преобразований вы, вероятно, можете обойтись без blah_tmp.txt, если только вы не захотите ее сохранить. – Denys

+0

awesome ..... спасибо за информацию. Я дам им попробовать, как только у меня появится шанс ... – bsisco