在PERL

时间:2016-08-18 21:26:06

标签: perl sockets csv udp

我是Perl和Networking部分的新手。 我必须在Perl平台上使用UDP协议将一些浮点数(我从CSV文件中获取)发送到硬件。

 #!/usr/bin/perl
#udpclient.pl

use IO::Socket;
use warnings;
use Time::HiRes qw (sleep);


my ($socket,$data);
#my $in_file_name = $ARGV[0];
$in_file_name='C:\Users\Aryan Sinha\Documents\RecordedData.csv';

open(INFILE,"<",$in_file_name) or die "Not able to open test file $!";

$socket = IO::Socket::INET->new (PeerAddr   => '21.22.32.214',
                                 PeerPort  => 5005,
                                 Type      => SOCK_DGRAM,
                                 Proto      => 'udp') or die "ERROR in
+ Socket Creation : $!\n";

while (<INFILE>)
{
    chomp;
    if($. != 1) #skip first line
    {
        $data=$_;  # Data would be in String format

        my @tempData = split(',', $data);

        $socket->send(@tempData);  #This throws an Erro
        sleep(0.25);
    } 

}

$socket->close();

@tempData是一个包含5个Deciaml值的数组,需要在一个数据包中发送。因为这些值来自单行。

硬件可以接收单,双和长双。我试图了解打包功能..但它对我没有任何意义。这是我使用perl的第4天操作系统。可能需要更多经验。

我还观察到我可以像这样发送不同的十六进制数字。

$socket->send(\x21\x43\xA2);

我们是否有这样的东西在一个数据包中发送浮点数。 ?

任何建议都是非常苛刻的。

2 个答案:

答案 0 :(得分:1)

您只能发送以字符串形式提供的字节。就像任何其他文件句柄一样。看到你已经将数字序列化了,你可以简单地使用以下内容:

while (<INFILE>) {
    next if $. == 1;
    $socket->send($_);
} 

为什么使用UDP而不是TCP!?!?这里完全不合适,因为它不能保证数据包到达,更不用说它们的发送顺序相同。

答案 1 :(得分:1)

UPD 好的,似乎我误解了要求,但万一有人偶然发现类似的任务......

如果你真的要求以二进制格式发送原始浮点数,pack确实是你正在寻找的。具体来说,为了发送5个数字的数组,它应该是

$socket->send( pack "d[5]", @tempData );

或者你可能希望发送尽可能多的号码,在这种情况下它是"d*"

您可能还需要更改为d<*little endian byte order)或d>*(大端),具体取决于设备的本机字节顺序。 (希望它不是心脏起搏器,所以你可以通过实验找出哪个是正确的)。

此处d表示类型(&#34; double&#34;),<>表示字节顺序,[5]*表示数量(* =您拥有的所有数量)。

P.S。如果设备需要文本数据,比如换行符号,那么join就可以了。