最近ネタがなかったのでサボっていましたが、今回pythonを使ってUDP通信ができるということを知ったのでその備忘録です。また、以下の記事の応用で、スマホではなくpythonからUDPで値を送ってみました。
1:pythonでUDP通信を行う方法
結論から言うと以下のプログラムでできます。(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」という名前のSSIDでWiFiが飛ぶようになります。pythonを実行するPCで「ESP32_wifi」に接続し、その後「send_udp.py」を実行するとシリアルモニタに「A」という文字列が1秒ごとに表示されます。
非常に簡単ですが、スマホだけでなくPCからでもUDP通信ができることがわかったので、何か面白いことに役立てたいと思っています。