シリアル転送で受信した画像をメソッド「POST」で送信するプログラムを、Python言語で作成します。シリアル転送での画像の送信は、「com0comによるシリアル接続の試験環境の構築」で設定した仮想のCOMポートを使用します。また、メソッド「POST」で送信した画像をブラウザで確認するために「メソッド「POST」で送られた画像をブラウザに表示」を使用します。画像ファイルのシリアル転送には、「RS232Cテストツール」を使用します。
プログラムの作成
シリアル転送で受信した画像をメソッド「POST」で送信するプログラムを次のように作成します。
- 26行目の「urllib.request.urlopen(req)」で、受信した画像データをHTTPプロトコルのPOSTメソッドで送信します。
- 37行目でシリアルデータを入力し、38行目でデータの受信を確認します。
- 40行目で受信したデータを保存します。
- 42行目で画像ファイルの受信が完了したかを判断します。30ms間(「time.sleep(0.01)」x33)データが入力されないと受信完了と判断します。
- 45行目で転送された画像のファイル名は「img.jpeg」とて保存します。
- 49行目で送信関数「sendimg」を呼び出します。
imginput/main.py
import serial import time from datetime import datetime import urllib.parse import urllib.request serialbuf = [] def sendimg(): # read image data f = open("img.jpeg", "rb") reqbody = f.read() f.close() # create request with urllib url = "http://localhost:3000" req = urllib.request.Request( url, reqbody, method="POST", headers={"Content-Type": "application/octet-stream"}, ) # send the request and print response with urllib.request.urlopen(req) as res: pass # print(json.loads(res.read())) def main(): print(datetime.now().strftime('%H:%M:%S.%f'), "Serial run") con = serial.Serial('COM11', 115200, timeout=0.01) loopcnt = 0 while True: indata = con.read() if len(indata) > 0: print(indata) serialbuf.append(indata) else: if loopcnt >= 3: loopcnt = 0 if len(serialbuf) != 0: with open("img.jpeg", "wb") as opfile: for i in range(len(serialbuf)): print("w ", serialbuf[i], " ") opfile.write(serialbuf[i]) sendimg() serialbuf.clear() else: loopcnt += 1 time.sleep(0.01) if __name__ == '__main__': # sendimg() # print(" end!\n") main()
プログラムの実行
メソッド「POST」で送信した画像をブラウザで確認するために、「メソッド「POST」で送られた画像をブラウザに表示」で作成したアプリを次のように使用します。
- Visual Studio Codeのエクスプローラーから「server.js」ファイルを選択し、「実行」メニューから「デバッグの開始」を選択します。
- ChromeでURL「http://localhost:3000/」を設定して、サーバアプリにアクセスします。
- 作成したプログラム「imginput/main.py」を実行します。
- 「RS232Cテストツール」を起動して次のように設定します。「COM12」は仮想のCOMポートとなります。
- 表示されている「FILE送信」ボタンをクリックして、画像ファイルを選択します。転送された画像のファイル名は「img.jpeg」となります。
- 次のように、Visual Studio Codeのデバッグコンソールにファイルが保存されたことが表示されます。
- 次のように、Chromeに「Advanced REST client」から送信したファイルが表示されます。