久しぶりに真面目なパソコンの使い方で、画面が黒いとそれらしく感じますw
M5StickCのブロックパーツにHTTPを扱えそうなものがあった。
参考になりそうなサイト様はこちら M5stackでLINEへ通信をしている。
まずは実験でローカルサーバを立ち上げることにした。
6年ぶりで頭がボケてるわ・・・
以下はその経過をメモ
※またまたMS社に惑わされる(しょうがないけど)対策は最終に書いてある
PCを「パブリック」に設定し、更に「ファイアウオールを解除」しないと他のLANパソコンから見えません。
作成したCGIはこの記事の一番後ろにあります(Step2)
Qstr.batという名のバッチファイルへ格納される。
Delphiしか扱えるコンパイラが無いし入れてないので、今回はバッチで対応した。
StickCには答えは不要なんだけど、この1行がサーバ上の out.txt へ追加されていきます。
内容は受信時刻とGETメソッドで送られてきたパラメータ並び
この記事はサーバ立ち上げまでです。
------メモ---------
■ローカル試験でのシステム検討
・サーバ上のCGI
HTTPサーバは当時の「anhttp」を使用する。重大な尾脆弱性があるというのでローカル環境でのテストにとどめる。
Apacheは重いし面倒だ。
そのために、7年前に作っていたBBSシステムを改造してサーバ上のCGIを作成しようかと。EXEは見つからなかった。
どこかへZipパッケージがあるようにも思うが・・・6年も前で分からん。
そこで問題になるのがDelphi/Razarusの開発環境。当時のソース「bbs」「choi3」を読むと
GetEnvironmentVariable('QUERY_STRING')がDelphi7以前では提供されていないという記述
・環境変数とCGIの参考サイト
https://www.futomi.com/lecture/form/index.html
・anHttpd
すでにサイトは閉鎖されているがインターネットアーカイブから再取得ができた。
ASUSポンコツPCで稼働させよう。軽いのでちょうどよい。
ちなみにプラザPCではウイルス対策ESETが邪魔をして起動できなかった。(自宅母艦ではOK)
・バッチでCGI?
サーバ側でバッチファイルを動かすだけでも良いみたいなので、
とりあえずは環境変数「QUERY_STRING」をテキストにアペンドするだけでOKかも
・Lazarus
ググった結果は先の環境変数を取得する関数はサポートされている模様
■anHttpdのインストール
C:\httpd142p へ展開フォルダを丸投げ設置
C:\httpd142p\readme.htmlにイントロ説明
システムの説明: file:///C:/httpd142p/httpd-docs/options.html
レジストリは「コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\AnHttpd」にありました。
「HKEY_LOCAL_MACHINE\SOFTWARE\AnHTTPd」に格納されるという記述はWin10では適用されません。
勝手に変更されるようです。
一回レジストリを消してみたら、初期値に戻った。
■実験経過
管理者として実行:常駐しました。管理者でない場合ログが記録されないとかの噂
ブラウザから「localhost」とだけURL指定して起動すると「Error404」が返ってきた。まずは動いてるぽい。
・しかしトラブルが
「http://127.0.0.1/readme.html」「http://localhost/readme.html」・・・存在してはいるのだが404エラーになる
自身の実IP、192.168.0.7もダメポート80/8080もダメ
「設定一般画面の”ドキュメントルート”」が「C:\Users\???\Desktop\httpd142p」になっとるやん
あ、昨晩デスクトップで解凍直後動かしたときに記録されてるんだわ・・・
「C:\httpd142p」に変更
上手くいきました。
・「http://localhost/cgi/cgisample.html」実験
表示された。が、「単純なテスト(localhost/cgi-bin/test.bat)」でバッチファイルを動かして環境変数を表示させるがダメ
フォルダ「cgi」は見えるが「cgi-bin」はダメ。この画面のリンク先はすべて「cgi-bin」です。
レジストリを消して再起動したところ、バッチファイルなど動く。
Postで送信した結果は「QUERY_STRING="inputtext=sss"」を取得できている。
ただし、返信のタイトル文字「」が化け化け
もう少しまともな回答は、入力された文字が返信されなかった。以下のPOSTの回答もタイムアウトになる。
ムムム・・・
まあ、getが使えるからいいかな・・・
・バッチファイルを呼ぶ際にquery_stringを勝手に追加して
http://localhost/cgi-bin/test.bat?qstr=ZZZZZZZZZZZZZZZ
とやってみたところちゃんと、
QUERY_STRING=qstr=ZZZZZZZZZZZZZZZ
環境変数一覧に反映されていた。
バッチにEcho QUERY_STRING >> a.txt
とかでどうかな?
■バッチファイルを作ってみる
・文字列含むラインのみ出力:win10にはfindstrが標準で入っていた。
使い方は https://www.k-tanaka.net/cmd/findstr.php
「set | findstr "QUERY_STRING"」でよさげです。が、この変数は外から見えないようで・・・
「set | findstr "Path"」ならちゃんと動いた。
・実行!
・用意するバッチファイル「qstr.bat」をcgi-binフォルダへ設置(1行の空白が必須重要)
@echo off
echo Content-Type: text/plain
echo.
echo -----------------------------
set | findstr "QUERY_STRING"
echo -----------------------------
・ブラウザからURL指定でGET指定で受信したデータのみを表示してみる。
http://localhost/cgi-bin/qstr.bat?qstr=ZZZZZZZZZZZZZZZ
結果は
-----------------------------
QUERY_STRING=qstr=ZZZZZZZZZZZZZZZ
-----------------------------
OKです。
・今度はこの文字列をout.txtへ追加していく
@echo off
echo Content-Type: text/plain
echo.
echo -----------------------------
set | findstr "QUERY_STRING"
echo -----------------------------
set | findstr "QUERY_STRING" >> out.txt
out.txtへこのCGIが呼ばれるたびに行が追加されていった。OKです。
「find」命令でも正規表現が使えないが、同様の結果が有られる。
・実行された日時時刻を入れてみる
date /T time /T で日時が取得できる。
echo %date% , echo %time% で既に変数に格納された日時が得られるので
変数workにセットするには
set work = %date%%time%
echo %work% で連結された変数が表示される
-----Step1---------------
@echo off
echo Content-Type: text/plain
echo.
echo -----------------------------
set | findstr "QUERY_STRING"
echo -----------------------------
set | findstr "QUERY_STRING" >> out.txt
-----Step2 一応完成-----------
@echo off
echo Content-Type: text/plain
echo.
set | findstr "QUERY_STRING" > temp.txt
for /f "usebackq tokens=*" %%a in (temp.txt) do @set HEAD=%%a&goto :exit_for
:exit_for
echo %date%%time%,%HEAD%
rem カンマで区切っている
echo %date%%time%,%HEAD% >> out.txt
これで
URL:http://localhost/cgi-bin/qstr.bat?x=xxx&y=yyy
回答:2020/08/2220:34:29.36,QUERY_STRING=x=xxx y=yyy
変数間はスペースで区切られてますネ
当然、out.txtには毎回時刻+データが追加記録される。
この程度のファイルはキャッシュに入ってるので速度が問題になることはないと思う。
-----Step3 失敗 -----------
前記ステップではtemp.txtへ引っ掛けた1行を一時的に格納してるが、これを省いて変数に格納したい。
が、そういう機能は標準ではないらしい。
参考にしたサイトがこちら https://syon.github.io/refills/rid/1498316/
FOR /F " DELIMS=" %%A IN ('time /T') DO SET T=%%A
これで%T%へ時刻が格納されると。
時刻は取得できたが、”time /T”コマンドを"set | findstr "QUERY_STRING" "に代えたらダメ・・・
ここで立ち止まるわけにはいかないので諦めます。
■※※※重要※※※※
Windows10のセキュリティはしっかりしておった。
同じLAN内でPingが飛ばない。不達になる
対策:ネットワークの設定+ファイアウオール設定が必要であった。
①ネットワークの設定画面で「接続プロパティの変更」「ネットワークプロファイル」をパブリックから「プライベート」に変更した。
言葉の意味が分からん。パブリックで資源が非公開だとさ。普通の人には理解不能だろ!バカMS
②続いて誘導される「Windowsセキュリティ画面」で、「microsoft Defender ファイアウオール」をOFFに設定する。
追記 2020/9/11
FireWallが開いてるとあまりにも警告がうざいのでOK有効 と選択したら
機内モードになるは、WiFiha全く何をあってもつながらないわ、やっぱりクソMS
急ぐので全オープンにするしかなかった。