CGIからポケベルに転送するには?

[上に] [前に] [次に]
せと 1999/10/27(水) 16:36:41
イントラネットの開発を行っているのですが、
perlによるCGIからポケベルに通報することは可能でしょうか?

open(MODEM, "> COM1:");
print MODEM "ATD12345....";
close(MODEM);

とやってみたのですがうまくいきませんでした。
HyperTerminalであればうまくいくのですが・・・

せと 1999/10/27(水) 16:40:53
書き忘れました。
OSはWindows NT 4.0 Workstationです。

print MODEM "ATD123456789\n";
print MODEM "ATD123456789\r";
print MODEM "ATD123456789\r\n";
binmode(MODEM); print MODEM "ATD123456789\r";

どれもうまくいきませんでした。
どなたか対処方法の分かる方、よろしくお願いいたします。

J.Naka 1999/10/30(土) 12:36:36
素人想像で、多分、wait処理がまずいのではと。
HyperTerminalは、通信プログラムそのものなので、内部でwait処理(API)やっていないと動かないし。
Perlで、MODEMの直接コントロールって出来るのかな、wait処理伝々よりもインタプリタだから不要なwaitがはいっているのかも?

きたむら 1999/10/30(土) 18:49:03
あまり詳しくないんですが,Windowsのシリアルポートは
オープンしたあと通信速度だのパリティだのを設定しないと
ちゃんと動いてくれなかったと思います。

せと 1999/11/01(月) 10:29:35
J.Nakaさん、きたむらさん、ありがとうございます。

http://www.harukaze.net/~mishima/perl/faq/Perl_for_Win32_FAQ_8j.html
にあるので出来ると思ったのですが、駄目なようです。

http://www.agri.gr.jp/weather/Wlogn88.bas
を見ると COM1:N81NN とあったので、open(MODEM, ">COM1:N81NN")
としてみましたが、これも駄目でした。コントロールパネルのシリアル
ポートの設定は、9600、8ビット、NoPari、Stopビット1、フローなしになっています。

不思議なことに、日立ソフトのTELstaffなどの、RS232Cへの書き込みを
行うソフトを一度でも動かすと、open(M, "> COM1:");でも正常に書き込めるようです。
でも、マシンを再起動してopen(M, "> COM1:")とすると駄目。

やはりなにか、初期化の処理が足りないのでしょうか。

ぺぱーど [E-Mail] 1999/11/02(火) 23:12:40
以下の2行で電話を掛けられます.(WIN95でCOM1に繋いだモデム)

open(MODEM,"> COM1:");
print MODEM "ATH1DT01234567890\r\n";

AT:ATコマンド開始
H1:回線接続
DT:ダイヤル(トーンで0123-456-7890に)

H1コマンドで回線接続(受話器を上げた状態)にしないとダイヤルしても繋がりません.
H1などのATコマンドは使用するモデムの説明書を参照して適宜追加修正の事.
(発信音待ちの必要や内線との区別などがあると思われるので)
またダイヤル後に一定時間の待ち処理を入れてから次のデータ(メッセージに相当)を
printしないといけないので注意です.
(ダイヤル中にメッセージを送信しては駄目.音声ガイドがあるならそれも待つ)
必要なデータを送信し終わったら回線切断コマンド(ATH0)で切って下さい.

これ以上の事は解かりません.取りあえず取っ掛かりになれば幸いです.

J.Naka 1999/11/03(水) 00:04:06
syntax error at modem.cgi line 44, near "open"

あぁ〜、期待を込めてやってみたげと、駄目だった〜(TT)

B-Cus 1999/11/03(水) 00:27:44
> syntax error at modem.cgi line 44, near "open"
そりゃただの perl の文法エラーでは。

> wait処理伝々よりもインタプリタだから不要なwaitがはいっているのかも?
いつも思うんですが、なぜJ.Naka さんは「インタプリタだから…」という
ような言い方をされるんでしょうか。別に perl でも Cで作ったバイナリでも
違いはありません。

例えば COM1 や /dev/cuaa1 にアクセスすることでモデムとやりとりが
できますが、その橋渡しをするのはドライバです。ドライバは、
こちらがインタプリタであろうがバイナリであろうが、区別しません。

ちなみに当方の FreeBSD では
 open(M,">/dev/cuaa1");
 sleep 1;
 print M "AT\r\n";
 sleep 1;
 print M "ATE1Q0\r\n";
 sleep 1;
 print M "ATDT********\r\n";
 sleep 10;
でできました。

ほんとは
 ・AT を送った後 OK-AT-OK (かな?) が返ってくるのを待つ
 ・ATE1Q0 を送った後 OK が返ってくるのを待つ
などというふうにプログラムを組まなくてはいけませんが、
そこらへんは端折って sleep しました。

# \r\n じゃなくて \r だけでもいいのかもしれない。

J.Naka 1999/11/03(水) 22:00:27
あっ流石!B-Cusさん!有り難う御座います(_ _)
いわゆるハンドシェイクってやつですよね。。Perlでもできるんでかぁ。なんか嬉しいぞ(^^)

-------------------
>いつも思うんですが、なぜJ.Naka さんは「インタプリタだから…」という
はい、全くそのとうりです。
何故自分がそう感じるかを言えば、少し長くなるので、かいつまんで、
インタプリタよりバイナリコードを掃き出すコンパイラ言語をやりたーい。
です。
以降、自分の中の「歯がゆさ」を出さないように気をつけます。(_ _)

せと 1999/11/10(水) 17:41:57
[[解決]]
回線接続コマンドを送ってみたり、sleep()してみたりしたのですが、
なぜかうまくいきませんでした。

HyperTerminalから直接やるとうまくいくのに。
なぜperlでできないのか謎です。

とりあえず、perlからではありませんが、Visual C++で、
SetCommなんとか()の関数を呼び出してやると
うまくいくようになりましたので、解決マークをつけます。

みなさん、どうもありがとうございました。

J.Naka 1999/11/11(木) 00:28:40
あぁ、prelのライブラリが悪いのかもしれないですね。

[上に] [前に] [次に]