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でソケット通信をしてみたい。