我是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);
我们是否有这样的东西在一个数据包中发送浮点数。 ?
任何建议都是非常苛刻的。
答案 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
就可以了。