raspberry pi picw W (以降pico)から、Wi-Fiで自分のパソコンにpythonで文字を送る実験をしています。 picoがクライアント、自パソコンがサーバーという役割です。 picoは自パソコンにUSBケーブルで接続し、Thonnyでクライアントプログラムを書き込みます。 このとき、picoから文字がWi-Fi経由で自宅ルーターを通り、LANケーブルを通じて自パソコンに来ます。 Wi-Fi接続後、picoからhello-1~hello-5まで送り、最後にquitを送って終了です。 なぜか自パソコン起動後の1回目だけサーバー側にあたるコマンドプロンプトにはhello-1~hello-5まで表示され、後は何回picoから実行しようがサーバー側にはhello-1しか表示されません。 (下記はpico側を4回実行したときのサーバー側コマンドプロンプト表示) s.bind s.listen hello-1hello-2hello-3hello-4hello-5quit hello-1 hello-1 hello-1 このときThonnyのシェル画面は、毎回下記のように表示されるので、文字はquit含めて全部送っているようです。 MPY: soft reboot Wi-Fi connected Server connected END それぞれのプログラム(抜粋)は下記です。 考えられる原因と対策についてアドバイスを頂けたら幸いです。 <pico側> import network import socket import time from machine import Pin # ********** Wi-Fiに接続 ********** (中略) print("Wi-Fi connected") # ********** 外部サーバーに接続 ********** # サーバーIDとポートの設定 (中略) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((ip, port)) print("Server connected") # byte単位でデータ送信 s.send("hello-1".encode("utf-8")) s.send("hello-2".encode("utf-8")) s.send("hello-3".encode("utf-8")) s.send("hello-4".encode("utf-8")) s.send("hello-5".encode("utf-8")) s.send("quit".encode("utf-8")) s.close() print("END") <自パソコン側> #!C:\(中略)python.exe # -*- coding: utf-8 -*- import socket (中略) # ソケット作成 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # IPアドレスとPORT番号でbind s.bind((ip, port)) print("s.bind") # サーバー有効化 s.listen() print("s.listen") # 接続・受信の無限ループ while True: # クライアントの接続受付 sock_cl, addr = s.accept() # ソケットからbyte形式でデータ受信 data = sock_cl.recv(1024) print(data.decode("utf-8")) if data.decode("utf-8") == "quit": break # クライアントのソケットを閉じる sock_cl.close() s.close() print("s.close")
プログラミング