TL;DR
- M5StackとPCでUDP通信をするサンプルはあったがTCP/IP通信をするサンプルがなかった(見つからなかった)ので作った.
- ESP32ならどれでも動くと思いますが,筆者はM5Stackを使用しています.
- プログラムはあくまでも一例かつ適当なクオリティですので,悪しからず.
M5Stackのプログラム
- TODOとコメントのある行は適切に値を入れてください.
- SSID, passはそのまま文字列として入れてください.
- IPは3桁ずつ区切って数値として(例:192, 168, 1, 100)入れてください.
- これをマイコンに書き込んでください
- ArduinoIDEで書き込めます
- 環境構築等についてはここでは省略
#include <WiFi.h>
const char ssid[] = "****"; // TODO
const char pass[] = "****"; // TODO
const int port = 11411;
const IPAddress local_ip(***, ***, ***, ***); //TODO
const IPAddress server_ip(***, ***, ***, ***); //TODO
const IPAddress subnet(255, 255, 255, 0);
WiFiClient client;
void setup() {
Serial.begin(115200);
WiFi.softAP(ssid, pass);
delay(100);
WiFi.softAPConfig(local_ip, local_ip, subnet);
Serial.print("AP IP address: ");
IPAddress myIP = WiFi.softAPIP();
Serial.println(myIP);
WiFi.begin(ssid, pass);
while( WiFi.status() != WL_CONNECTED) {
delay(500);
}
Serial.print("Local port: ");
Serial.println(port);
client.connect(server_ip, port);
}
void loop() {
if (client.available()) {
int val = client.read();
Serial.printf("%c\n", val);
}
if (Serial.available()) {
Serial.read();
char write_data[1];
write_data[0] = 'a';
Serial.printf("write\n");
client.write(write_data, 1);
}
}
Pythonスクリプト
sock_server.pyなどと名前をつけて保存してください.
import socket
import time
def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(("", 11411))
sock.listen(1)
print "waiting for socket connection"
(clientsocket, address) = sock.accept()
print("Established a socket connection from %s on port %s" % (address))
s = clientsocket
s.settimeout(0.5)
cnt = 0
while True:
try:
send_data = ['a', 'b', 'c']
s.send(send_data[cnt % 3])
cnt +=1
try:
rcv_data = s.recv(1, socket.MSG_DONTWAIT)
print(rcv_data)
except socket.timeout as e:
pass
time.sleep(1)
except:
s.close()
if __name__ == '__main__':
main()
実行方法
-
- マイコンのシリアルポートを開く(ArduinoIDEのシリアルモニタ等.ボーレートは115200.)
-
-
$ python sock_server.py
とターミナルで実行
-
-
- マイコンの電源を入れる(すでに電源が入っていたらリセット)
-
- シリアルモニタに
a, b, c
と順に送られていたらPC→マイコンへの通信が成功している
- シリアルモニタに
-
- シリアルモニタでエンターキーを入力するとターミナルに
a
が送られる
- シリアルモニタでエンターキーを入力するとターミナルに