今回はボタンを追加しました。こんな感じになります。

2つのボタン。”Port” ボタンは、LEDのオンオフ用。”Clear” ボタンは GPIO PortのClear用です。今回もPython,HTML,CSSファイルの構成になっています。
先ずはCSS ファイル。ファイル名は、”http_server_03.css”です。
http_server_03.css
@charset "UTF-8";
.t_font {
        font-size: 40px;
        font-weight:bold;
        font-style: italic;
        color: #0ff;
}
.b_frame {
        width: 400px;
        background: #363636;
        padding: 15px;
        border-radius: 10px;
        margin-top: -30px;
        margin-right: 10px;
}
button {
        display: block;
        margin: 10px;
        line-height: 50px;
        cursor: pointer;
        color: #fff;
        background: #228b22;
        border-radius: 10px;
        font-size: 24px;
	    width:120px;
}
前回から、”button”の追加と、フォントの大きさ色を変更しています。
続いて、HTMLファイル。ファイル名は、”index_03.html”です。
index_03.html
<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1">
        <link rel="stylesheet" type="text/css" href="./http_server_03.css" >
        <title>http-server 1.0</title>
    </head>
    <body>
        <center>
        <div class="b_frame">
   	    <div class="t_font"><u>HTTP-Server 1.0</u></div><br>
		    <form method='get'>
    	        <button type='submit' name='1' value='0' >Port</button>
    	        <button type='submit' name='2' value='0' >Clear</button>
            </form>
        </div>
        </center>
    </body>
</html>
追加されたボタンは、14,15行目です。
最後にPythonファイル。ファイル名は、”hello_03.py”。これはちょっと長いです。
hello_03.py
from http.server import HTTPServer, SimpleHTTPRequestHandler
from urllib.parse import urlparse,parse_qs
import RPi.GPIO as GPIO
led_stat = 0
GPIO.setmode(GPIO.BCM)      
GPIO.setup(17, GPIO.OUT)   
GPIO.output(17,0)        
class MyHandler(SimpleHTTPRequestHandler):
    def do_GET(self):
        global led_stat
        fl = 1
        if self.chk_file() == 0:
            parsed = urlparse(self.path)
            params = parse_qs(parsed.query)
            a=next(iter(params))
        #-----  LED ON/OFF  --------------
            if a == "1":
                if led_stat == 0:
                    GPIO.output(17,1)
                    print("LED_On\n")
                    led_stat = 1
                else:
                    GPIO.output(17,0)
                    print("LED_Off\n")
                    led_stat = 0
        #-----  Port Clear  --------------
            elif a == "2":
                GPIO.cleanup()  
                print("IO_Clear\n")
        else :
            fl = 0
        if fl == 1:
            f = open("index_03.html",'rb')
            self.send_response(200)
            self.send_header('Content-type', "text/html")
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
    #-------------------------------------------------
    def chk_file(self):
        a = 0
        if self.path == "/":
            self.path = "/index_03.html"
            dataType = "text/html"
            a = 1
        if self.path.endswith(".css"):
            dataType = "text/css"
            a = 1
        if a == 1:
            self.path = "." + self.path
            f = open(self.path,'rb')
            self.send_response(200)
            self.send_header('Content-type', dataType)
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        return a
#---------------------------------------------------------
host = ''
port = 8080
httpd = HTTPServer((host, port), MyHandler)
print('serving at port', port)
httpd.serve_forever()
と言ってもこれくらいの長さですが。プログラムの流れを説明します。
- 2行目: from urllib.parse import urlparse,parse_qs
- urlparse,parse_qs この2つはクエリの処理に使います。
 
- 3行目: GPIO用 インポート。
- 5行目: LEDの状態を表す変数。外部変数で宣言しています。
- 7,8,9行: LEDの初期設定。GPIO17のポートを使用しています。GPIOの説明ページと同じ回路を用いてLEDを
 オン/オフしています。
- 17行目: クライアントからの要求がファイルなのかdef chk_file(self):でチェックします。
- 18,19,20行: この3行で、クライアントから送られて来たクエリを処理しています。- 今回のクエリは /?1=0 となります。
 - 18行: parsed.query= “1=0”
- 19行: paramsはdictionaryで {‘1’: [‘0’]} となり
- 20行: ここで ’1’ が取り出されます。
- この辺の詳細は、”urlparse – URL を部分文字列に分割する” を参照下さい。
 
- 23行目: LEDオンオフ用のボタンが押された事を判断。
- 34行目: GPIOポートクリア用のボタンが押された事を判断。
- 39行目: クライアントからのリクエストがファイルの場合 fl=0
- 42から47行: indexファイルを送る処理。
- 50から68行: クライアントからのファイル要求に対応。
いつも通りに全て同じフォルダーに入れてターミナルから、python3 hello_03.py を実行して下さい。

ブラウザに、”raspberrypi.local:8080″と入力。HPの画面でPortボタンを押せばLEDがオンオフします。

次回は、java scriptについて説明します。