2011年9月3日土曜日

WiMAX の切断がひどい

WiMAX 使ってると,たまに通信が切断されてその後全く通信できなくなることがある.
ググッてみると,一番多いのは無線 LAN が切断される現象らしいが,うちの場合は PC ⇔ WM3500R の通信は生きているので,どうも WM3500R ⇔ 基地局 の通信が切れているらしい.

じゃあ WiMAX の電波状態が悪いのかというとそうでもなくて,アンテナは常に 2本立ちだし,不思議なのが WM3500R を再起動させれば通信が回復する.いちいち WM3500R を再起動させるのはストレスが溜まるんだけど,こんなのをユーザーサポートに問い合わせてもどうせ電波状態で片付けられるんだろうなぁ.

というわけで,一定時間通信できなかったら WM3500R の再起動ページを kick する perl スクリプト書いてみた.
#!/usr/bin/perl -w

use strict 'vars';
use strict 'refs';
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);

my $TimeoutCnt;

while( 1 ){
    $_ = `ping -n 1 www.yahoo.co.jp -w 1000`;
    if( !/Reply from/ ){
        ++$TimeoutCnt;
    }else{
        $TimeoutCnt = 0;
    }
    
    print( "Timeout = $TimeoutCnt\n" );
    if( $TimeoutCnt >= 15 ){
        RebootWM3500R();
        
        print( "restarting WR3500...\n" );
        
        sleep( 10 );
        while( 1 ){
            $_ = `ping -n 1 192.168.0.1 -w 1000`;  # WM3500R が再起動するまで待つ
            last if( /Reply from/ );
        }
        print( "done\n" );
        $TimeoutCnt = 0;
    }
    
    sleep( 1 );
}

sub RebootWM3500R {
    # リクエストの生成
    my $url      = 'http://web.setup/index.cgi/reboot_main_set';
    my %formdata = (
        'UPDATE_BUTTON' => '%BA%C6%B5%AF%C6%B0',
        'DUMMY' => '',
        'DISABLED_CHECKBOX' => '',
        'CHECK_ACTION_MODE' => '1',
    );
    my $request  = POST( $url, [%formdata] );
    
    # UserAgentを生成して処理
    my $ua  = LWP::UserAgent->new;
    my $res = $ua->request( $request );
    
    #print $res->as_string;
}

# WR3500 の admin 認証
package LWP::UserAgent;
sub get_basic_credentials {
    return ( 'admin', 'hogehoge' );
}

←でこれを走らせている時のネットワークのモニタ結果.
縦の目盛りが 5分だから,大体 5分毎に再起動を繰り返してるのがわかると思う.
なんぢゃこりゃwwww


余談だけど,このスクリプトを書くときに,再起動ページの POST メソッドの送信データを調べる必要があって,最初はパケットモニタソフトでも入れようかと思ってたんだけど,すげー簡単な方法があった.
計算機と戯れる日々
この方法はなかなか目からウロコだ.

0 件のコメント:

コメントを投稿