death114 发表于 2015-12-26 14:58:47

perl串口通信实例

  使用串口通信,在备机端使用如下脚本检测来自主机的心跳信号,一旦未接受次数超过指定记数,备机认为主机DOWN机,自动设置为主机的网络参数,顶替主机提供服务。

# ! perl -w

usestrict;
useWin32 :: SerialPort;

my   $port   =   ' COM2 ' ;#serail port name registried in OS
my   $count   =   0 ;#count number of heartbeat-receiving failture
my   $max_count   =   5 ;#max fail count to be tolerated
my   $interface   =   '

# ----------------------------------
# 接口 IP 配置         
# ----------------------------------
pushd interface ip


# "local" 的接口 IP配置

set address name="local" source=static addr=192.168.6.185 mask=255.255.255.0
set address name="local" gateway=192.168.6.65 gwmetric=0
set dns name="local" source=static addr=192.168.6.112 register=PRIMARY
add dns name="local" addr=192.168.6.201 index=2
set wins name="local" source=static addr=none


popd
# 接口 IP 配置结束


' ;#net inetrface config information

suberrlog {
   # log the failtrue occuring time
   
   openERR ,   ' >>err.log ' ;
   my   @time   =   localtime ();
   my   $time   =   sprintf ( " %d " ,   $time [ 5 ]+   1900 )
                         .   ' - '
                         .   sprintf ( " %d " ,   $time [ 4 ]+   1 )
                         .   ' - '
                         .   " $time "
                         .   '   '
                         .   sprintf ( " %.2d " ,   $time [ 2 ])
                         .   ' : '
                         .   sprintf ( " %.2d " ,   $time [ 1 ])
                         .   ' : '
                         .   sprintf ( " %.2d " ,   $time [ 0 ]);
   printERR$time . " \n " ;
   closeERR;
}

subipchange {
   #change ip addrress
   
   openTMP ,   ' >tmp ' ;
   printTMP$interface ;
   closeTMP;
   
   eval{
         system   ' netsh -f tmp ' ;
         unlink   ' tmp ' ;
    };
   
   if($@) { return   0 ;}
   return   1 ;
}

my   $ob   =Win32 :: SerialPort -> new( $port ) ordie   " CANNOT OPEN $port " ;
#open serial port

eval{
   #set serial port properties
   
   $ob -> baudrate( 9600 );
   $ob -> parity( ' none ' );
   $ob -> databits( 8 );
   $ob -> stopbits( 1 );
   $ob -> handshake( ' none ' );
};
   
if($@) { die   ' SET FAILED ' ;}

$ob -> write_settings ordie   " CANNOT WRITE $port DRIVER " ;
#write to port driver to make it active

while( 1 ) {
   #loop receiving heartbeat from remote machine
    # change ip address after designated count of failture
   
   my( $length ,   $result )=   $ob -> read ( 10 );
   
   if( $result ) {
         $count   =   0 ;
    }elsif( $count   ==   $max_count ) {
      errlog();
         if(not ipchange()) {print   ' IP CHANGE FAILED ' ; }
         last ;
    }   else{
         $count ++ ;
    }
   
   sleep ( 1 );
}

undef   $ob ;
页: [1]
查看完整版本: perl串口通信实例