ラズベリーパイPico Wでやりたいことの一つにマイコンで得たデータをデータ収集用のサーバに送信することがあります。
今回はラズベリーパイPico WをHTTPクライアントにして、POSTでサーバに対して値を送信してみます。
先にパソコンの方でリクエスト受信用のサーバを構築します。
今回はラズベリーパイ4Bを使用しますが、Pythonを実行できるパソコンであれば何でも良いです。
※以後のコードはラズベリーパイ4Bを含めたDebian系のLinuxでの実行になります。
※今回の内容でサーバ側のマシンとしてクロームブックを使用したい場合はクロームブックでWebサーバを立ち上げるでIPアドレスについてを一読してから話を進めるようにしてください。
最初に端末(ターミナル)を開き、下記のコマンドでパソコンの方のローカルネットワークのIPアドレスを調べます。
$ hostname -I
192.168.1.27という値が表示されました。
この値はラズベリーパイPico Wの方で使用します。
※利用しているネットワークによって上記の値は異なります
続いてサーバの準備をします。
コードは説明用で~/workspace/pi-server/server.pyを作成します。
※~(チルダ)にはラズベリーパイ4Bであれば、/home/piが入ります。
~/workspace/pi-server/server.py
from http.server import HTTPServer from http.server import BaseHTTPRequestHandler import cgi class RequestsHandler(BaseHTTPRequestHandler): def do_POST(self): self.send_response(200) self.send_header("User-Agent","sample") self.end_headers() html = "OK" self.wfile.write(html.encode()) # POST されたフォームデータを解析する form = cgi.FieldStorage( fp=self.rfile, headers=self.headers, environ={'REQUEST_METHOD':'POST', 'CONTENT_TYPE':self.headers['Content-Type'], }) # HTTP Clientから「value=%s」の値を送信している為、form["value"].valueで値を取得する print("value:"+form["value"].value) return ip = '0.0.0.0' port = 8000 server = HTTPServer((ip, port), RequestsHandler) print("Serving HTTP on "+ip+" port "+str(port)+" (http://"+ip+":"+str(8000)+"/)") server.serve_forever()
下記コマンドでサーバを立ち上げます。
$ pyyhon3 ~/workspace/pi-server/server.py Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
今回のサーバはPOSTのリクエストのみ許可していて、ブラウザのアドレスバーに直接URLを打ち込んでも501エラーになり、ページが表示されません。
ラズベリーパイPico Wの方のコードの作成を行います。
main.py
import network import utime import machine import urequests # ssidは必ず2.4GHz帯(11n)の方を使用 ssid = "your ssid" pw = "your password" # POST先のURL url = "http://192.168.1.27:8000" def connect(ssid, pw): wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect(ssid, pw) wait = 0 while wlan.isconnected() == False: print("Waiting for connection...") utime.sleep(1) wait += 1 if wait > 20: raise RuntimeError("network connection failed") ip = wlan.ifconfig()[0] print(f'Connected on {ip}') return ip def http_post(url, value): # https://docs.openmv.io/library/urequests.html body = "value=%s" % (value) headers = {'Content-Type': 'application/x-www-form-urlencoded'} response = urequests.post(url, data=body, headers=headers) print(response) try: ip = connect(ssid, pw) http_post(url, "1") except KeyboardInterrupt: machine.reset()
上記のコードの詳細は端折りますがThonny上で実行するとサーバに対してvalue=1の値を送信します。
urequests — Network Request Module — makeblock micropython docs 1.0.0 documentation
実行後にコンソールに出力された内容を確認してみると、
Connected on 192.168.1.35
のような値が出力されていました。
パソコンの方の端末(ターミナル)で出力された内容を見てみます。
192.168.1.35 - - [04/Apr/2023 09:29:23] "POST / HTTP/1.0" 200 - value:1
ラズベリーパイPico Wから送信した値をサーバ側で受信出来ていることを確認しましょう。
4. ネットワークの基礎 — MicroPython latest ドキュメント