#! perl -w use strict; use Win32::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 sub errlog { #log the failtrue occuring time open ERR,'>>err.log'; my@time=localtime(); my$time=sprintf("%d",$time[5] +1900) .'-' .sprintf("%d",$time[4] +1) .'-' ."$time[3]" .'' .sprintf("%.2d",$time[2]) .':' .sprintf("%.2d",$time[1]) .':' .sprintf("%.2d",$time[0]); print ERR $time."\n"; close ERR; } sub ipchange { # change ip addrress open TMP,'>tmp'; print TMP $interface; close TMP; eval { system'netsh -f tmp'; unlink'tmp'; }; if ($@) {return0;} return1; } my$ob= Win32::SerialPort->new($port) or die"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 or die"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;