Python ラズベリーパイ3でHTTPサーバを動作させ、ネットワーク越しにLEDを操作する

PythonでのHTTPサーバの実装には、BaseHTTPServerを使用する。

まず、プログラム全体を載せる。

HTTP server with python

メインプログラム

メインプログラムの流れは 図 1 のようになる。

f:id:mickey_happygolucky:20170527141423p:plain

図 1: メインプログラム.

非常に簡単。 このプログラムの肝となるのは、TestHandlerの実装となる。

TestHandlerの実装

TestHandlerのインターフェイスは 図 2 のようになる。

f:id:mickey_happygolucky:20170527141430p:plain

図 2: TestHandlerクラス.

do_GET()の実装

do_GET()の流れは 図 3 のようになる。

f:id:mickey_happygolucky:20170527141456p:plain

図 3: do_GET()の流れ.

do_GET()はサーバに対してGETリクエストを投げられた時にコールバックされる。

path変数にはアクセス先が格納されている。

ui.htmlへアクセスされた場合は、html変数に設定してある内容を返す。 htmlには、このサーバの機能をブラウザから呼び出せるようにするためのページが記述されている。

それ以外のページにアクセスされた場合は404を返す。

do_POST()の実装

do_POST()の流れは 図 4 のようになる。

f:id:mickey_happygolucky:20170531005428p:plain

図 4: do_POST()の流れ.

do_POST()はサーバに対してPOSTリクエストを投げられた時にコールバックされる。

path変数にはアクセス先が格納されている。fromデータはcgi.FieldStorage()で取得する。

ここではstateの値によってLEDを点灯、消灯する。

process_post_haeder()の実装

process_post_haeder()は 図 5 のようになる。

f:id:mickey_happygolucky:20170527141521p:plain

図 5: process_post_header()の流れ.

get_ip_address()について

ui.htmlで返すHTMLのform actionには、サーバのIPアドレスを設定する必要がある。 しかし、スクリプトが実行されるIPアドレスは実行時までわからないため、@HOST@という文字列にしておき、 下記のようにget_ip_address()で取得したIPアドレスで置換している。

    html = html.replace('@HOST@', get_ip_address())

get_ip_address()の処理の流れは 図 6 のようになっている。

f:id:mickey_happygolucky:20170527141554p:plain

図 6: get_ip_address()の流れ.

socketを開き、試しに8.8.8.8へ接続を試み、その時に使用されたネットワークインターフェイスのアドレスを取得する。

Ledクラスについて

特に言うこともないので省略する。