(ESP32の目次)

ESP32側を常時起動状態のサーバにし、これに対してパソコンからTCP信号を送るプログラムを作成します。ESP32側のスケッチの例としてSimpleWifiServerがあります。これは、ブラウザからTCP信号を送信し、その内容に基づいてESP32に接続したLEDを点灯/消灯させるものです。

このスケッチを改変して、ESP32で受信したTCP信号のメッセージをシリアルモニタに表示するプログラムとします。流れとしては、まずWiFi.begin(ssid, password);でWifiに接続します。次に、WiFiServer server(ポート番号);で宣言したserverを、server.begin();で起動します。ここまでが準備です。その後、loop()関数の中で、server.available();により接続を要求するクライアント(パソコン)を待ち受けます。client.connected()でクライアントと接続している状態で、client.available()で受信した信号があった場合に、client.readStringUntil('\r')で1行分のデータを読み込みます。一文字読み込みの場合にはclient.read()とします。接続が解除されたらclient.stop();で停止し、次の接続を待ちます。

#include <WiFi.h>

const char* ssid     = "yourssid";
const char* password = "yourpasswd";

WiFiServer server(6342);

void setup()
{
    Serial.begin(115200);
    delay(10);

    // We start by connecting to a WiFi network

    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected.");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    
    server.begin();
}

void loop(){
  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.print("New Client: ");           // print a message out the serial port
    Serial.print(client.remoteIP()); //
    Serial.print(": "); 
    Serial.println(client.remotePort());//
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        String line = client.readStringUntil('\r');
        Serial.println(line);
      }
    }
    // close the connection:
    client.stop();
    Serial.println("Client Disconnected.");
  }
}
 
送信側のパソコンのプログラムをPythonで書いた例です。ESP32のIPアドレスを指定して接続し、文字列とカウント値を1秒ごとに送信します。socket.socket(socket.AF_INET, socket.SOCK_STREAM)の第2引数でSOCK_STREAMを指定するとTCP通信になります。tcp_client.connect((client_ip, client_port))でクライアントであるESP32に接続します。tcp_client.send(bytes_msg)でバイト配列に変換した文字列を送信します。
import socket
import time

client_ip = "192.168.3.18"
client_port = 6342
buffer_size = 1024

tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

tcp_client.connect((client_ip, client_port))
count = 0
while True:
    msg = 'TCP Send Python ' + str(count) + '\r'
    count += 1
    bytes_msg = bytes(msg, encoding="utf-8")
    tcp_client.send(bytes_msg)
    time.sleep(1)
 
実行結果は以下のようになります。1秒ごとにカウント値が増えます。パソコン側のプログラムを終了するとESP32側で接続が解除されます。
 
スクリーンショット 2022-07-22 13.41.23
 
(ESP32の目次)