#!/usr/local/bin/perl ############################################################################### # # NetGenesis4 接続・切断・状態確認・時刻設定 CGI (1999.02.06) # nwg4con.cgi # Copyright(C) 1998-1999 M.Okamura (anb@y7.net) # http://hp.vector.co.jp/authors/VA008536/ # # 動作確認(通信プロトコルは独自解析のものです。) # Firmware Version : 2.0022 (PS1) # Firmware Version : 1.x でも動作可能だと思う。(未確認) # Perl for Win32 build 316 + MS PersonalWebServer # TurboLinux 3.0J 付属の Perl + apache # # 改変は自由です。もっと使いやすくしてください。 # CGIな処理(引数とか)の部分をカットすればコマンドライン版にもできますね。 # MacPerlでも動きそうです。 # # NetGenesis4は株式会社マイクロ総合研究所(http://www.mrl.co.jp/)の製品です。 # ############################################################################### # NetGenesis4のIPアドレス(各自の環境で書き換えてください)#################### $them = '192.168.0.1'; # for test(一つだけコメントアウトすると、コマンドラインから確認できます) #### #$ENV{'QUERY_STRING'} = 'connect=1'; #$ENV{'QUERY_STRING'} = 'disconnect=1'; #$ENV{'QUERY_STRING'} = 'time=1'; #$ENV{'QUERY_STRING'} = 'status=1'; # コマンド固有バイト列(シリアル2を使う人はコメントを外してください)######### $time = "\x41\x0B"; $connect = "\x01\x6A"; # SERIAL 1 $disconnect = "\x01\x68"; # SERIAL 1 $status = "\x01\x64"; # SERIAL 1 #$connect = "\x01\x6B"; # SERIAL 2 #$disconnect = "\x01\x69"; # SERIAL 2 #$status = "\x01\x65"; # SERIAL 2 # CGI引数解析 ################################################################# if ($ENV{'REQUEST_METHOD'} eq "POST") { read( STDIN , $buffer , $ENV{'CONTENT_LENGTH'} ); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split( /&/ , $buffer ); foreach $pair ( @pairs ) { ( $name , $value ) = split( /=/ , $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $form{$name} = $value; } # 引数から使用するコマンド決定 ################################################ $cmd = ''; $cmd = $connect if( $form{'connect'} ne '' ); $cmd = $disconnect if( $form{'disconnect'} ne '' ); $cmd = $time if( $form{'time'} ne '' ); $cmd = $status if( $form{'status'} ne '' ); # コマンドが未定義の場合は、メニュー表示 ###################################### if( $cmd eq '' ) { print "Content-type: text/html\n\n"; print < NWGset lite

NetGenesis4

($them)

MENU ; exit(0); } # エラー処理の手抜きのため、ここでヘッダ出力 print "Content-type: text/plain\n\n"; # コマンド列生成 ############################################################## $packetno = "\x00\x02"; $NULL2 = "\x00\x00"; $NULL8 = "\x00\x00\x00\x00\x00\x00\x00\x00"; # IPアドレスをバイト列に変換 if( $them =~ /^(\d+).(\d+).(\d+).(\d+)$/ ) { $ipaddress = pack( "C4",$1,$2,$3,$4 ); } else { die $!; } if( $form{'time'} ne '' ) { # 時刻設定の場合 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); $data = pack( "n3", $hour, $min, $sec ); $datasize = "\x00\x0A"; } else { # 接続・切断・状態確認の場合 $data = ''; $datasize = "\x00\x04"; } # 最終的に流すコマンド列 $packet = "$packetno$NULL2$cmd$datasize$NULL8$ipaddress$data"; # 通信処理 #################################################################### # NetGenesis4で使用するUDPポート $port = 4449; # これらはOSによって値が異なるかも。socket.hあたりを参照すればわかる。 $AF_INET = 2; $SOCK_DGRAM = 2; # ここから先はほとんど公式 $sockaddr = 'S n a4 x8'; ($name,$aliases,$proto) = getprotobyname('udp'); ($name,$aliases,$port) = getservbyname($port,'udp') unless $port =~ /^\d+$/; #($name,$aliases,$type,$len,$thataddr) = gethostbyname($them); $thataddr = $ipaddress; $that = pack($sockaddr, $AF_INET, $port, $thataddr); # ソケット生成 if( socket(S, $AF_INET, $SOCK_DGRAM, $proto) ) { binmode S; } else { die $!; } # データ送信 if( send(S, $packet, 0, $that) ) { ; } else { die $!; } # 結果処理 #################################################################### if( $form{'connect'} ne '' ) { print "接続コマンドを送信しました。\n"; }elsif( $form{'disconnect'} ne '' ) { print "切断コマンドを送信しました。\n"; }elsif( $form{'time'} ne '' ) { printf("時刻設定をしました。%02d:%02d:%02d\n", $hour, $min, $sec); }elsif( $form{'status'} ne '' ) { # 状態受信(受信方法ってこんなんでいいのか?) $data = ' '; recv(S, $data, 24, 0); $stat = substr( $data, 21, 1 ); print "切断\n" if( $stat eq "\x03" ); print "処理中\n" if( $stat eq "\x04" ); print "接続\n" if( $stat eq "\x05" ); print "\n"; } exit(0);