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


socket_com_wifi


本題となるマイコンで得られたデータをWiFiを経由してサーバに送信するということを見ていきたい。

使用例としては、施設内に設置した温度計で温度というアナログデータをAD変換でデジタル値にした後にWiFi経由でコンピュータにソケット通信でデータを送信する

AD変換器の概要に触れる


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