ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【python】UDP通信の方法【ESP32】

 最近ネタがなかったのでサボっていましたが、今回pythonを使ってUDP通信ができるということを知ったのでその備忘録です。また、以下の記事の応用で、スマホではなくpythonからUDPで値を送ってみました。

rikoubou.hatenablog.com



1:pythonUDP通信を行う方法
 結論から言うと以下のプログラムでできます。(python3系)

・send_udp.py

from __future__ import print_function
import socket
import time
from contextlib import closing

def main():
  host = '192.168.4.1' # IPアドレス
  port = 10000 # ポート番号
  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  with closing(sock):
    while True:
      message = 'A'.encode('utf-8') # 送る文字列(ここでは「A」という文字列を送っている)
      print(message)
      sock.sendto(message, (host, port))
      time.sleep(1)
  return

if __name__ == '__main__':
  main()


2:pythonからUDPで送信された内容をESP32で受信する
 先に挙げた記事内容のスケッチほぼそのままです。

・ESP32_UDP.ino

#include <WiFi.h>
#include <WiFiUdp.h>

const char ssid[] = "ESP32_wifi"; // SSID
const char pass[] = "esp32pass";  // password
const int localPort = 10000;      // ポート番号(pythonのポート番号に合わせる)

const IPAddress ip(192, 168, 4, 1);       // IPアドレス(pythonのIPアドレスに合わせる)
const IPAddress subnet(255, 255, 255, 0); // サブネットマスク

WiFiUDP udp;

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

  WiFi.softAP(ssid, pass);           // SSIDとパスの設定
  delay(100);                        // 追記:このdelayを入れないと失敗する場合がある
  WiFi.softAPConfig(ip, ip, subnet); // IPアドレス、ゲートウェイ、サブネットマスクの設定

  Serial.print("AP IP address: ");
  IPAddress myIP = WiFi.softAPIP();
  Serial.println(myIP);

  Serial.println("Starting UDP");
  udp.begin(localPort);  // UDP通信の開始(引数はポート番号)

  Serial.print("Local port: ");
  Serial.println(localPort);
}

void loop() {
  if (udp.parsePacket()) {
    char c = udp.read();
    Serial.println(c); // UDP通信で来た値を表示
  }
}

 ESP32に上記スケッチを書き込むと「ESP32_wifi」という名前のSSIDWiFiが飛ぶようになります。pythonを実行するPCで「ESP32_wifi」に接続し、その後「send_udp.py」を実行するとシリアルモニタに「A」という文字列が1秒ごとに表示されます。


 非常に簡単ですが、スマホだけでなくPCからでもUDP通信ができることがわかったので、何か面白いことに役立てたいと思っています。


・参考資料
Pythonでネットワークプログラミング | saito's memo