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のライブラリが悪いのかもしれないですね。
[上に]
[前に]
[次に]