■インターネット接続手順の必要性

現在ほとんどのプロバイダはダイアルアップ接続に関してはPAP(CHAP)認証で接続することができ、接続手順に関してはパワーザウルスやザウルスポケットの標準設定で接続することができます。

しかし、一部のプロバイダや海外でローミングサービスを利用する場合は接続スクリプトを書く必要があります。

ザウルスシリーズでスクリプトを書く場合はWindows95等のスクリプトに見られるコマンド体系とは違った「接続手順」コマンドを利用して書く必要がありますが、これに関して解説した資料というのは見たことがありません。

ザウルスで書く接続手順に関して研究してみました。


■テスト対象

私が加入しているプロバイダはASAHI-NET、KCOM、NIFTY(HyperROAD)ですが、KCOMに対するログインスクリプトを書いてみました。

本来KCOMも標準的なPPP接続手順+PAP認証で接続のための手順も不要なのですが、Windows95のダイアルアップ接続時にログインウィンドウを開いてコマンドを使った接続を行うことができます。

まず、Winodws 95で接続がどのような手順で行われるのかをログインウィンドウを開いて確認してみます。


■接続までの流れ

KCOMの場合はアクセスポイントに電話するとまず最初に"Login:"と表示されコネクションIDの入力を要求されます。

コネクションIDを入力すると"Password:"と表示されパスワードを入力するとサーバからIPアドレスが提供されます。

ここで疑問に思ったのはこのような接続をした場合にレンタルされるIPアドレスをパワザウはどのように取り込むかという点なのですが、良くわかりません(^^;
接続までできたらちゃんと動くのです。

NIFTYのHyper ROADも同様なチェックをしてみましたがKCOMと同じように接続することができました。


■ザウルスの手順コマンド

手順に関してはマニュアルに記載されていますが、海外旅行などで持っていない場合なども考えられます。

本来ザウルスプラザでこれぐらい公開すれば良いと思うのですが、その気が無いようなので私のほうでマニュアルから転載します。

手順仕様を見ていて思うのは制御構造(IFとかFOR,DO-UNTILループ)が無いためにWin95用のスクリプトをそのまま置き換えることができない、NIFTYなどのアクセスに利用する場合にも会議室の自動巡回などで面倒な書き方をする必要があるということでしょうか(^^;  実際私もほとんど書くことはありません。

->接続手順コマンド


■接続手順を使う場合の設定

接続手順1 接続条件1

コネクションIDとコネクションパスワードは接続手順中に設定するため、ここは適当で構いません。
 メールアカウント以降はプロバイダから提供された正しいものを設定するようにして下さい。

注意点として、海外ローミングを使う場合はPOPサーバとSMTPサーバが別のものになります。
この場合はメールアカウントに自分のメールアカウント+ "@" +POPサーバ名、メールサーバにSMTPサーバを指定します。
左の例では"pop.asahi-net.or.jp"がPOPサーバ、"mail.asahi-net.or.jp"がSMTPサーバです。

接続手順2 接続条件2

ここの接続手順を「要」に設定して手順を記述します。

手順はここに直接入力しても良いのですが、見通しよく作業するためにパソコンのエディタで編集してインクワープロに転送するか、インクワープロ上で書いてから「インクワープロ参照」を使って貼り込んだほうが良いでしょう。

接続手順3 接続条件3

ここの設定もプロバイダから指定されたものを入力します。

もし、ローミングサービスのネームサーバが"Dynamic"または"自動","サーバからもらう"の指定になっている場合は国内の場合と同じものを設定してみて下さい。(たまにこの方法で失敗するときがありますが、その場合はローミング先のプロバイダにネームサーバアドレスを聞くなどの対応をして下さい)

接続手順4 接続条件4

ここの変更は必要ないはずです。

認証は"PAP"のままで大丈夫だと思いますが、もし、手順が正常終了したのにエラーなどが出る場合はこの部分を「無」にしてみて下さい。

接続条件5の変更は不要です。

■接続手順の例

ここではWindows 95に付属しているダイアルアップ用スクリプト"pppmenu.scp"を例に手順コマンドを作成してみます。

接続手順を利用する場合、接続設定1のコネクションIDやコネクションパスワード、一連のメールアカウント設定、接続設定3のネームサーバー1、2は正しく設定しておく必要があります。 color="#FF0000">(が、設定したIDやパスワードが上手く送出されない場合があるようです)

接続設定3のIPアドレスは「サーバーからもらう」設定にします。

■オリジナルの"pppmenu.scp"とザウルス手順の対比

オリジナルはスクリプトを作成しやすいようにコメントだらけです。

■例で作成した手順とKCOM(NIFTY HyperROAD)で利用可能な手順

 もう少しエラー処理を書く必要がありますが、とりあえずのサンプルとして示します。

pppmenu.scpの内容 ザウルス側接続手順 コメント
; このスクリプトは、メニュー形式で PPP接続を行うサンプルです。
; 一般的に、スクリプトは mainと呼ばれるプロシジャーが必要です。スクリプトは、この mainプロシジャーが最初に実行され、スクリプトファイル中に必ず一つ存在しなければなりません。
 
; スクリプトのエントリ・ポイント
;
proc main
ザウルスでは特に必要無し
; 以下の変数を、お使いになるインターネットサービス・プロバイダにあわせて変更してください。
(再試行回数)
integer nTries = 3
ザウルスでは制御構造が使えないので別の方法で試行回数を実現。(後述)
; ログオン・プロンプトとタイムアウト値の設定

string szLogin = "username:"
integer nLoginTimeout = 3

; パスワード入力プロンプトとタイムアウト値の設定

string szPW = "password:"
integer nPWTimeout = 3

; パスワード入力後に表示されるプロンプトの定義

string szPrompt = "annex:"

ザウルスでは変数名が記述できないので直接手順内で記述。(後述)
; インターネット サービス・プロバイダと通信を確立するためのコマンドを設定します。
; このサンプルでは、通信を確立するためにコマンドを一つ送信する場合を想定しています。
; お使いになるインターネットサービス・プロバイダが通信の確立のために一つ以上のコマンドを必要とする場合には、必要に応じてコマンドを追加してください。
;
; このサンプルでは、使用するインターネットサービス・プロバイダが下記のようなメニューを表示することを想定しています:
;
; 1 : Our special GUI
; 2 : Establish slip connection
; 3 : Establish PPP connection
; 4 : Establish shell access
; 5 : Download our software
; 6 : Exit
;
; annex:
;

string szConnect = "3^M"
この部分はプロバイダによって対応方法が違います。

NIFTYやKCOMではこのようなメニューはありません。

; IP アドレスを取得したくない場合には、下記の値を FALSE にしてください。

boolean bUseSlip = FALSE
ザウルスには関係なし。
; ホスト側のコマンド入力待ち状態が安定するのを待つため2秒間待ち、キャリッジ・リターンを2回送ります。

delay 2
transmit "^M^M"
W:2
S:'\n\n'
2秒待って\m(改行)を送信

このとき改行コードが"\013\010"や"\M"などの場合もあるので調整する必要があります。

; 変数 nTriesで決められた回数、ログオンを試みます。

while 0 < nTries do

; 指定されたタイムアウト時間ログオン・プロンプトを待ち、ユーザーIDを送ります。

waitfor szLogin then DoLogin
until nLoginTimeout

TryAgain:
transmit "^M" ; ping
nTries = nTries - 1

endwhile

goto BailOut
J:5,'username:',SENDID
S:'\n'
J:5,'username:',SENDID
S:'\n'
J:5,'username:',SENDID

P:5,'username待ちでエラーが発生しました'
L:ERR
コネクションID要求プロンプトが"username:"の場合の例です。

5秒待って"username:"という文字列が来なければ次の行へ移ります。

再試行時には改行コードを1回送ってサーバの応答を見ます。

3回試行して"username:"という文字列が来ない場合は何らかの通信エラーがあるということでエラー処理にジャンプします。

DoLogin:
; ユーザーIDを送ります。

transmit $USERID, raw
transmit "^M"
:SENDID
S:'\I'
S:'\n'
:SENDIDはラベルです。
"username:"プロンプトが来た場合にここにジャンプします。

"\I"はインターネット接続条件設定の「コネクションID」に記述した文字列となります。

S:'\I\m'でも構いません。

マニュアルでは"\I"でIDが送出されるとありますが、送られない場合があるようです。

; パスワード入力プロンプトを待ちます。

waitfor szPW until nPWTimeout
if FALSE == $SUCCESS then
goto TryAgain
endif
J:10,'password:',SENDPASS
P:5,'パスワードが送出できません'
L:ERR
"password:"という文字列が来るまで40秒待ちます。
; パスワードを送ります。

transmit $PASSWORD, raw
transmit "^M"
:SENDPASS
S:'\P'
S:'\n'
:SENDPASSはラベルです。
"password:"プロンプトが来た場合にここにジャンプします。

"\P"はインターネット接続条件の「コネクションパスワード」に記述した文字列となります。

マニュアルでは"\P"でパスワードが送出されるとありますが、送られない場合があるようです。

  R:5'username:',SENDNO
P:5,'IDかパスワードが間違っています'
L:ERR
もし、ここで再度"username:"プロンプトが出る場合はコネクションパスワードが間違っているのでエラー処理します。
; プロンプトを待ちます。

waitfor szPrompt
transmit szConnect
SENDNO:
R:255,'annex:',ERR
S:'3\n'
プロバイダによってログイン後のプロンプトの出方が違います。

この例の場合はメニューが表示された後で"annex:"というプロンプトが出ます。

その中の3番目のメニュー(Establish PPP connection)を選択します。

if bUseSlip then
; IP アドレスをホストから得る場合、下記の
; set ipaddr getip 2 コマンドで得る以外に、もしホストが IP アドレスを表示してくれる場合には、そのメッセージを待ち、set ipaddr getip コマンドでIP アドレスを得ることも可能です。

set ipaddr getip 2
endif
この部分はザウルスに同等機能がないため関係なし。
goto Done E: 接続完了。
この後ザウルス上でIPアドレス他の取得のためのコネクションが行われるようです。
BailOut:
; スクリプトの実行中にタイムアウト、あるいは予期しない
; 状態が発生した場合、スクリプトの実行を中止します。

set screen keyboard on
halt

Done:

endproc
:ERR
P:5,'接続できません'
O:
メッセージを表示して通信を切ります。

■例で作成した手順とKCOM(NIFTY HyperROAD)で利用可能な手順

もう少しエラー処理を書く必要がありますが、とりあえずのサンプルとして示します。

例で作成したもの KCOM(NIFTY HyperROAD)用
コネクションIDとパスワードに"\I"と"\P"を使ってもなぜか上手く接続できないのですが、直接IDやパスワードを書くと接続できます。謎(^^;
W:2
S:'\n\n'
J:5,'username:',SENDID
S:'\n'
J:5,'username:',SENDID
S:'\n'
J:5,'username:',SENDID
P:5,'username待ちでエラーが発生しました'
L:ERR
:SENDID
S:'\I'
S:'\n'
J:10,'password:',SENDPASS
P:2'パスワードが送出できません'
L:ERR
:SENDPASS
S:'\P'
S:'\n'
R:5'username:',SENDNO
P:2,'IDかパスワードが間違っています'
L:ERR
SENDNO:
R:255,'annex:',ERR
S:'3\n'
E:
:ERR
P:5,'接続できません'
O:
W:2
J:5,'Login:',SENDID
S:'\n'
J:5,'Login:',SENDID
S:'\n'
J:5,'Login:',SENDID
P:2,'Login待ちでエラーが発生しました'
L:ERR
:SENDID
S:'----コネクションID----'
S:'\n'
P:1,'ID送出完了'
J:10,'Password:',SENDPASS
P:2,'パスワードが送出できません'
L:ERR
:SENDPASS
S:'----コネクションパスワード----'
S:'\n'
P:1,'パスワード送出完了'
R:5,'Login:',DONE
P:2,'ID/パスワードが間違っています'
L:ERR
'接続完了
:DONE
E:
'エラー処理
:ERR
P:2,'接続できません'
O:

 赤字の部分はデバッグ用のメッセージ、その部分まで実行できたかどうかを確認できます。


■もう一つの事例

 IBMネットやATTネットで利用されているローミングサービスに対応したものです。

Win95のスクリプト 内容 ザウルス手順 手順コメント 手順
; Script1: sci-w95.scp, Platform: w95
; REV: 97.8.1
;
コメント     W:2
S:'...\013\010'
J:5,'NETWORK',DOLOGIN
S:'...\013\010'
J:5,'NETWORK',DOLOGIN
S:'...\013\010'
J:5,'NETWORK',DOLOGIN
L:ABORT
:DOLOGIN

P:1'LOGIN開始'
W:2
S:'-ログインID-\013\010'

P:1,'ID送出完了'
R:30,'password'
W:2
S:'-パスワード-\013\010'

P:1,'パスワード送出完了'
R:30,'active'
W:1
S:'-アクティブ-\013\010'

P:1,'アクティブ送出完了'
J:30,'connected'm,DONE
:ABORT
O:
:DONE

P:1,'接続手続き送出完了'
W:2
E:
proc main スクリプトの先頭    
integer nTries = 3 ログインプロンプト待ちのリトライ回数    
delay 2 2秒待ち W:2  
while nTries > 0 do 繰り返し回数が"0"以上なら実行    
transmit "...^M" "...^M"(改行)の送信 S:'...\013\010' 改行コードを"\013\010"としていますが、"\N"や"\M"の場合もあります。
waitfor "SITA NETWORK" then DoLogin until 5 "SITA NETWORK"という文字列を5秒間待つ J:5,'NETWORK',DOLOGIN  
nTries = nTries -1 文字列が来ない場合はリトライする(2回) S:'...\013\010'
J:5,'NETWORK',DOLOGIN
S:'...\013\010'
J:5,'NETWORK',DOLOGIN
ザウルス側にループ処理がないため同じ記述を3回します。
endwhile ログインプロンプト待ちの終わり    
; timed out リトライしてもログインプロンプトが来ない場合    
goto Abort Abortにジャンプする L:ABORT ABORTに無条件ジャンプ
DoLogin: ログイン処理 :DOLOGIN  
delay 2 2秒待ち W:2  
transmit "***********^M" ID送出 S:'-ログインID-\013\010'  
waitfor "password" "password"の文字列待ち R:30,'password' R:100の"100"の部分はもっと小さな数字の方が良いはずです。
delay 2 2秒待ち W:2  
transmit "***********^M" パスワード送出 S:'-パスワード-\013\010'  
waitfor "active" "active"の文字列待ち R:30,'active' ここの数値も同様
delay 1 1秒待ち W:1  
transmit "***********^M" アクティブコード?送出 S:'-アクティブ-\013\010'  
waitfor "connected" "connected"の文字列待ち J:30,'connected',DONE "connected"が来たらDONEにジャンプ
goto Done ログインに成功したらDoneにジャンプ    
Abort: ログインできないとき :ABORT 異常終了処理
; allow manual completion マニュアル入力を可能にする(ザウルス側に対応処理なし)    
set screen keyboard on      
halt 処理停止 O: 手順を終了し回線を切ります。
Done: ログイン成功時 :DONE  
delay 2   W:2  
endproc スクリプトの終わり E: 手順を終了しその後の処理はザウルス側で行われます。

■手順の謎

手順解説の中にも書きましたが、"\I"や"\P"でIDやパスワードを送出しようとしても正常に送出されないようです。

デバッグ用メッセージを入れたのはそれを確認するためなのですが、ID送出が確認できても"Password:"プロンプトがサーバから返されないようで(タイムアウトする)、この部分を実際のIDやパスワードに置き換えると何も問題無く接続できます。

何らかの文字列が送出されていれば少なくとも"Password:"は返るはずですが、試しに"\I"の行だけコメントアウトしても同じ結果になることから"\I"でIDが送出されていないようです。

コマンドのバグかと思って同様のコマンドをNIFTY SERVE用のMYオリジナルメニューに記述して試してみると確かに設定されたIDやパスワードが送出されるようなのでインターネット接続手順記述上の問題なのかどうか謎です(^^?


■改行コードは一体何?

接続スクリプトに興味があるので、関連質問が出る度にあれこれ書いてみたのですが、改行コードで引っかかったことがあります。

国内プロバイダ(本来はPAP認証で接続可能)にたいしては"\N"で接続できるのですが、海外プロバイダでは"\013\010"とする場合があるようです。(\013\010は CR LFに該当します)

"^M"の解釈をどうするか? の問題なのですが、実際にやってみないとわからないことは結構あるものです。


MI-610マニュアル通信編 P232より転載赤字はまるとの補足

■記述の仕方

コントロールコード
\n \N 改行コード
\r \R 0dh
\m \M 0dh
\013\010 Win95接続スクリプトにおける "^M" に該当
\000 (00-255) 10進3桁の任意のコントロールコード
\I 設定されているID(NIFTY,インターネット)<インターネット手順ではダメかも>
\P 設定されているパスワード(NIFTY,インターネット)<インターネット手順ではダメかも>
\\ 「\」の文字

コマンドで記述する「'」「"」「」「」は入れないで下さい。

1コマンドラインの長さは最大255文字です。

■コマンドリファレンス(:と’は見にくいので全角にしてありますが、実際は半角です)

コマンド 意味 書式
ラベルを定義します。 R,J,Lコマンドでジャンプする位置を定義します。 :ラベル :ERROR
:MAIL
:END
S 指定された文字列を送信します。1行文を送信するときは改行コードも含めて下さい。 S:文字列 S:'GO MAIL\n'
S:GO MAIL\nABC\n'
R 指定された文字列を指定された時間だけ待ちます。指定の文字列を受信できない場合、ラベルが指定されているとラベルのコマンドへ進み、指定されていないときは次のコマンドへ進みます。

秒数は0〜255の値を指定できます。

R:秒数,文字列[,ラベル] R:10'MAIN>'
 10秒間 MAIN>を待ち、受信したらすぐに次のコマンドへ進み、受信しなくても10秒後に次のコマンドに進みます。
R:10,'MAIN>',END
 10秒間 MAIN>を待ち、受信したらすぐに次のコマンドへ進み、受信しないときは10秒後にENDのラベルのコマンド行に進みます。
W 指定された時間停止します。 秒数は0〜255の値を指定できます。 W:秒数 W:20
L 指定されたラベルに無条件にジャンプします。 L:ラベル L:ERR
J 指定した文字列を受信したときに、指定したラベルにジャンプします。指定した文字列を受信できないときは次のコマンドに進みます。

分岐数は10以内です。

J:秒数,文字列,ラベル[;文字列,ラベル...] J:10'SHARP',L1;'ZAURUS',L2

SHARPを受信したらL1へ、ZAURUSを受信したらL2へジャンプ

指定した文字列をコメントとして扱います。他のコマンドと異なり「:」は必要ありません。文字列を’’で囲む必要はありません。 ’文字列 ’パスワード送信
P 指定した時間ウィンドウを開き、指定した文字列を表示します。秒数は0〜255の値を指定できます。 P:秒数,文字列 P:3,'エラー'
P:10,'エラーです\r最初からやり直して下さい'
O 通信途中でも強制的に回線を切断し、初期画面にもどります。 O: O: 強制切断
E 手順を終了します。
スクリプトファイルの終了では、自動的に「E」コマンドが実行されます。

NIFTY SERVEでは

E:[n] E:0

通信画面

E:1

ザウルスネットのアイコン画面

 n=0ならば手順を終了し通信画面に戻ります。
 n=1ならば手順を終了しトップメニュー画面に移ります。
 省略時はn=0と同じです。
 パソコンネットの場合は手順を終了し通信画面に戻ります。