NodeMCUでHTTP GETリクエストを試してみたまでの記事で、マイコン(ESP8266)のWiFi周りの基本的な操作に触れたので、

本題となるマイコンで得られたデータをWiFiを経由してサーバに送信するということを見ていきたい。
使用例としては、施設内に設置した温度計で温度というアナログデータをAD変換でデジタル値にした後にWiFi経由でコンピュータにソケット通信でデータを送信する。
いきなり、OS有りのコンピュータとマイコン間でデータのやりとりは大変なので、まずは一台のPCでソケット通信を行ってみる。
今回の内容はRaspberry Pi 4B 8GにRaspberry Pi OSをインストールしたシングルボードコンピュータで行った。
受信側のsrv.pyと送信側のcli.pyの二つのコードを用意した。
/path/to/dir/srv.py ※srvはserver(サーバ)の略
import socket
PORT = 12345
BUF_SIZE = 1024 #データ受信の際のサイズ 2の累乗の値にする
# IPv4で通信をする時はAF_INETを指定する
# ソケットはストリームを用いる
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.bind(('127.0.0.1', PORT))
sock.listen() # ソケットの受信の準備完了
print("Waiting for connection.")
while True:
(conn, cli) = sock.accept() # ソケットを受信した時
try:
print('Client connected', cli)
# BUF_SIZEで指定した分のbytesオブジェクトのデータ
data = conn.recv(BUF_SIZE)
print('Received:' + data.decode())
# クライアントの方に文字列をデータを送り返す
mes = 'Successed!'
conn.send(mes.encode())
finally:
conn.close()
/path/to/dir/cli.py ※cliはclient(クライアント)の略
import socket
PORT = 12345
BUF_SIZE = 1024
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.connect(('127.0.0.1', PORT))
data = input('input:')
# 上の行で入力したデータをサーバに送信する
sock.send(data.encode())
# サーバから返ってきたデータを出力する
print(sock.recv(BUF_SIZE).decode())
端末を立ち上げ、下記のコマンドを実行する。
$ python3 /path/to/dir/srv.py Waiting for connection.
受信側のサーバが立ち上がった。
続いて、別ウィンドウとして新しい端末を立ち上げ、下記のコマンドを実行する。
$ python3 /path/to/dir/cli.py input:
クライアントが立ち上がり、入力欄が出力された。
srvの方の端末を見てみると、
$ python3 /path/to/dir/srv.py
Waiting for connection.
Client connected ('127.0.0.1', 55690)
となっていた。
別途に立ち上げた二つの端末間で通信が開始しているようだ。
cliの端末の方で
$ python3 /path/to/dir/cli.py input:hoge Successed!
hogeと入力してエンターキーを押して送信したら、Successed!というメッセージが返ってきて接続が終了した。
srvの方を見てみると、
$ python3 /path/to/dir/srv.py
Waiting for connection.
Client connected ('127.0.0.1', 55690)
Received:hoge
cliから送信したhogeという値を受け取っていた。
次は2台のPCでソケット通信をしてみたい。





