(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();で停止し、次の接続を待ちます。
送信側のパソコンのプログラムを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)でバイト配列に変換した文字列を送信します。
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)

コメント