Raspberry Pi 3 model BにOSをインストールしたらhttp.server を持ったpython3が同時にインストールされました。このライブラリを使うとhttpサーバを簡単に立ち上げる事が出来ます。カスタマイズ出来る軽いサーバとしてかなり重宝しています。
プログラムを書く前に
Raspberry Piで何か開発する場合Raspberry Piで全て行っても良いのですが、プログラムはデスクトップで実行のみRaspberry Piとした方が開発の効率が上がります。そこで、SSHとSambaを使って、両者をつなぎます。
- デスクトップからRaspberry Pi にSSHを使って接続。接続後、開発用のディレクトリに移動。
- Sambaの共有フォルダを開発用のディレクトリに設定し、デスクトップと共有。
- デスクトップのエディタを使用しプログラムを書き、Raspberry Piの共有フォルダに保存
- その後、SSHの画面からプログラムを実行する。
Pi 3 model BはWiFiを持っているので、Pi 3には電源ケーブルをつなぐだけで開発が出来ます。
今回のネット環境は下記の様にRaspberry Pi とデスクトップPCは1つのルータにつながっている状態です。
先ずは、Hello HTTP を表示
プログラムは非常に簡単です。
hello.py
from http.server import HTTPServer, SimpleHTTPRequestHandler
class MyHandler(SimpleHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', "text/html")
self.end_headers()
self.wfile.write("<h1>Hello HTTP!</h1> \n".encode())
host = ''
port = 8080
httpd = HTTPServer((host, port), MyHandler)
print('serving at port', port)
httpd.serve_forever()
- 1行目: from http.server import HTTPServer, SimpleHTTPRequestHandler
- HTTPServer :サーバ本体のモジュール
- SimpleHTTPRequestHandler: GETやPOST等コマンド関係のモジュール
- 3行目: class MyHandler(SimpleHTTPRequestHandler):
- SimpleHTTPRequestHandlerクラスを基底にした新しいクラスの宣言
- ここで、クライアントからの要求を処理。
- 5行目: def do_GET(self):
- クライアントから、”GET”要求が有った場合、この関数が実行される。
- 7行目: クライアントに、”GET”要求を受けた事を返答。
- 8行目: これから送るデータは、”HTML”形式
- 9行目: 先ずはヘッダーをクライアントに送信
- 10行目: ”<h1> Hello HTTP!</h1> \n”をクライアントに送信し送信完了。
- 12行目: host = ”
- ここは、ホスト名を指定する箇所ですが、この様に指定して下さい。
- これで、サーバーへのアクセスは以下の様になります。
- Raspberry Piから=>”localhost”
- 他のコンピュータから=>”raspberrypi.local”
- 13行目: 通信に使うポートを指定します。今回は8080.
- 14行目: ここでサーバが起動します。
- 15行目: これで、サーバが無限ループとなる様です。
プログラムは、”hello.py” と保存して下さい。SSHで同じディレクトリに移動し、$ sudo python3 hello.py と実行して下さい。これでサーバが立ち上がります。
ブラウザ側ですが、今回はポートに8080ポートを指定しているので
- 違うPCからアクセスする場合: ”raspberrypi.local:8080″と入力
- Raspberry Piからアクセスする場合: ”localhost:8080″と入力
”Hello HTTP!”が表示されました。簡単に動作の説明をすると
- ブラウザのURL欄に、”raspberrypi.local:8080″または、”localhost:8080″を入力
- これで、サーバにGETリクエストが送られます。
- GETリクエストを受けたサーバは、 do_GET(self)を実行します。
- do_GET(self)では、
- クライアントにGETリクエストを受けた事:self.send_response(200)を返し、
- クライアントに、”Hello HTTP!”を送信
- 送信後サーバはクライアントからのリクエスト待ループに入る。
- サーバからのデータを受けたクライアントのブラウザの画面には、”Hello HTTP!”が表示される。
です。
またHTTPサーバの停止は、SSHの画面で、”Ctrl+C” を押せば停止します。
次回は、HTMLをファイルに保存して、”index.html”をクライアントに送ってみようと思います。