モデムから電話をかけるJavaScript

COMポートにつながったアナログモデムを操作して、PCから電話をかけたい。

背景

うちの会社は、NTTのボイスワープを使って、電話を転送している。

  • 平日の昼間は、転送を停止して、普通に会社で電話を受ける
  • それ以外の時間帯は、社長のケータイへ転送

こういうことをやっている。朝、出社したら転送を終了させる。そして帰宅時に転送を開始する。これを毎日毎日やる。

転送の開始と終了は、電話機から「14211」「1420」に電話をかけて切るだけ。とっても簡単操作。

簡単とはいえ、同じ事を3回やると自動化したくなる性格なので、これをなんとかしたい。

モデムから電話をかける

PCにモデムがついてるので、ここから電話をかける。

Windowsで[スタート]→[ファイル名を指定して実行]を選んで、

dialer

と打ち込むと、「ダイヤラ」が起動する。ここで番号を打ったら、電話をかけることができた。

ちゃんとボイスワープの設定も可能なことが確認できた。あとはこれを自動化するだけだ。

copyコマンド

Windows(やDOS)では、標準入力やCOMポートもファイルシステムのように認識されている。コマンドプロンプト

C:\>copy con COM3
atdt14211

と打つと、「atdt14211(改行)」という内容がCOM3に送信される。「con」はコンソール、つまり標準入力。この内容を「COM3」つまりモデムへコピーしているわけだ。

「atdt」はトーン信号で電話をかけるコマンド。直後に入れた番号へダイヤルする。14211ってのはさっき書いたように転送開始を設定するための電話番号。別になんの番号でもいい。自分のケータイ番号を入れてみても面白いかも。ちなみにパルス信号の場合は「atdp」。こういうのを「atコマンド」と呼んで、ググればいくらでも情報は出る。

つまり、「COM3」という架空のファイルに対してatコマンドの文字列を書き込めば、モデムを操作することができる、というわけだ。

これを応用すると、

atdt14211

というファイルをあらかじめ作っておいて(これをhoge.txtとする)、

C:\>copy hoge.txt COM3

こうするだけで電話をかけることができる。こうやってcopyコマンドでモデムを操作するってのがすごいなーと驚いてたけど、こういうのに詳しい人にしてみれば当たり前のことらしい。

JavaScriptからFileSystemObjectを使って

ここまでは調査。実際には大好きなJavaScriptで書きたい。JavaScriptによるWSHで。

WSHではFileSystemObjectが使えるので、これでCOM3という名前のテキストファイルをオープンし、そのテキストファイルにコマンドを書き込む感じ。コードを見た方が早い。

var fso = new ActiveXObject('Scripting.FileSystemObject');
var com = fso.OpenTextFile('COM3', 2);
com.WriteLine('atdt14211');
WScript.Sleep(12000);
com.WriteLine('ath');
com.Close();
  1. まずFileSystemObjectをnewする。
  2. OpenTextFileメソッドで、COM3という名前のファイルを書き込みモードでオープンする。
  3. "atdt14211"というコマンドを書き込む。WriteLineなので末尾に改行コードも入る。この瞬間にダイヤル開始。
  4. 何もしないで12秒待つ。電話がつながって転送設定がされるまでこれくらいかかるっぽい。
  5. "ath"というコマンドを書き込む。これは電話を切るためのatコマンド。
  6. 終わり。

たった6行のコード。このコードをメモ帳か何かで「begin.js」みたいな名前で保存する。あとはそのファイルをダブルクリックすれば実行される。

「COMポートを使ってモデムと通信」というと難しそうだけど、実際にはCOM3という名前のファイルにテキストを書き込むだけなので簡単だった。

また、転送を終了させるためのJavaScriptは、上記のコードの電話番号のところを「1420」にするだけで良い。

完全自動化するには

jsファイルをダブルクリックする手間すら省きたいなら、このjsをタスク スケジューラに登録しておけばいい。好きな時刻や好きなタイミングで自動でjsファイルを呼び出すようにできる。

Vistaでは動かない

なぜかこのコードがWindows Vistaでは動作しない。OpenTextFileのところで

エラー: 書き込みできません。
コード: 800A0046
ソース: Microsoft JScript 実行時エラー

のエラーになる。

Windows Vista上で起動したVirtual PCで動作するWindows 2000からは正常な動作を確認できた。なんでVistaはダメなんだろう。