10
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ESP32マイコンとPCでTCP/IP通信する方法

Last updated at Posted at 2020-12-01

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()

実行方法

    1. マイコンのシリアルポートを開く(ArduinoIDEのシリアルモニタ等.ボーレートは115200.)
    1. $ python sock_server.pyとターミナルで実行
    1. マイコンの電源を入れる(すでに電源が入っていたらリセット)
    1. シリアルモニタにa, b, cと順に送られていたらPC→マイコンへの通信が成功している
    1. シリアルモニタでエンターキーを入力するとターミナルにaが送られる
10
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?