シリアル転送で受信した画像をメソッド「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」で送られた画像をブラウザに表示」で作成したアプリを次のように使用します。

  1. Visual Studio Codeのエクスプローラーから「server.js」ファイルを選択し、「実行」メニューから「デバッグの開始」を選択します。
  2. ChromeでURL「http://localhost:3000/」を設定して、サーバアプリにアクセスします。
  3. 作成したプログラム「imginput/main.py」を実行します。
  4. 「RS232Cテストツール」を起動して次のように設定します。「COM12」は仮想のCOMポートとなります。
  5. 表示されている「FILE送信」ボタンをクリックして、画像ファイルを選択します。転送された画像のファイル名は「img.jpeg」となります。
  6. 次のように、Visual Studio Codeのデバッグコンソールにファイルが保存されたことが表示されます。
  7. 次のように、Chromeに「Advanced REST client」から送信したファイルが表示されます。