P7208977


前回のコンピュータ二台でソケット通信を試すの記事でRaspberry Piをサーバ側、Ubuntuをクライアント側にしてソケット通信を試した。

目標のマイコンで温度等のアナログ値を取得して、遠方のRaspberry Piにデータを送信するという事に近づく為に、今回はESP8266のモジュールをクライアント側にしてソケット通信を試す。


Raspberry Piのsrv.pyのコードは前回と同じにして、端末を開いてsrv.pyを実行しておく。




P1149598


UbuntuにESP8266のNodeMCUをUSBで繋いで、thonnyを開き、main.pyを下記のようにする。

main.py

import network

SSID = '{使用中のWiFiのSSID}'
pw = '{上記SSIDに対応した暗号キー}'
IP = "192.168.0.27" # サーバ側のIPアドレス
PORT = "12345" # サーバ側のポート

def do_connect():
    import network
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect(SSID, pw)
        while not wlan.isconnected():
            pass
    print('network config:', wlan.ifconfig())


def send_socket(addr, port):
    import socket
    sock = socket.socket()
    sock.connect((addr, port))
    mes = "send socket from esp8266"
    sock.send(mes.encode())
    while True:
        data = sock.recv(1024)
        if data:
            print(data.decode())
        else:
            break
    sock.close()

do_connect()
send_socket(IP_ADDRESS, PORT)

thonnyのエディタ上でコードを実行する場合は、do_connect()は必要ないが、NodeMCUに直接電力を共給した場合はWiFiに接続するための手続きが必要になる。

thonnyでコードを実行する際は、開発機のWiFiの接続状況を共有しつつ、ローカルネットワークでは違うデバイスとして認識されるようだ。




開発機からNodeMCUを外して、USBケーブル経由で直接電力を供給してみたところ、Raspberry Piの方の端末で下記のように出力された。

$ python3 srv.py
Waiting for connection.
Client connected ('192.168.0.20', 3173)
Received:send socket from esp8266

ESP8266モジュールがどのようにWiFiを利用するのか?が少しずつ見えてきた。


ローカルネットワーク間ではあるが、マイコンからPCに対してデータを送信出来る方法がわかったので、次回から温度等のデータを送受信する方法を見ていこう。