2019年8月12日月曜日

ESP-WROOM-02からmacOSにUDP通信

マイコンボードESP-WROOM-02からmacOSにUDP接続して通信テストを行った.

macはiPhoneにテザリングして,iPhoneをWiFiアクセスポイントとする.この時点で,iPhoneのWiFiアクセスポイントの設定は以下のとおり.

  • SSID: iPhone7PlusBlack
  • PASSWORD: qatacygd60y8u

macの設定は以下のとおり.

  • IP address: 172.20.10.4
  • router: 172.20.10.1

これに,ESP-WROOM-02から以下のようにUDPで接続する.

  • mac側UDPポート: 30000
  • ESP-WROOM-02 UDPポート: 31000
  • ESP-WROOM-02 IP address: 172.20.10.10

送信は,とりあえず1秒ごとに"abcd"という文字列を送信するだけ.
ESP-WROOM-02のプログラムは以下のとおり.
#include <esp8266wifi .h>
#include <wificlient .h>
#include <wifiudp .h>

WiFiUDP UDP;

IPAddress HOSTIP(172, 20, 10, 4);
const int remoteUdpPort = 30000;

IPAddress myIP(172, 20, 10, 10);
const int localUdpPort = 31000;

const char *ssid = "iPhone7PlusBlack";
const char *password = "qatacygd60y8u";

void connectWiFi() {
  Serial.println("WiFi setup start");
  WiFi.begin(ssid, password);
  WiFi.config(myIP, WiFi.gatewayIP(), WiFi.subnetMask());
  Serial.println("start_connect");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("CONNECTED!");
  Serial.println("WiFi setup done");
}

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println("Serial setup done");

  WiFi.mode(WIFI_STA);
  UDP.begin(localUdpPort);
  connectWiFi();
}

void sendWiFi(char byteData[]) {
  if (UDP.beginPacket(HOSTIP, remoteUdpPort)) {
    UDP.write(byteData);
    UDP.endPacket();
    Serial.println(byteData);
  }
}

void loop() {
  char a[4];
  a[0] = 'a';
  a[1] = 'b';
  a[2] = 'c';
  a[3] = 'd';
  sendWiFi(a);
  delay(1000);
  end_loop();
}

void end_loop() {
  if (WiFi.status() != WL_CONNECTED) {
    WiFi.disconnect();
    Serial.println("disconnect!");
    connectWiFi();
  }
}

mac側のPythonプログラムは以下のとおり.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Python 3.7.3 on macOS 10.15 Catalina Beta
# 2019/8/4
# receive JSON data by UDP

import argparse
import threading
import time
from socket import *

class ServerThread(threading.Thread):
    def __init__(self, ADDRESS="127.0.0.1", PORT=30000):
        threading.Thread.__init__(self)
        self.data = None
        self.kill_flag = False
        # line information
        self.ADDRESS = ADDRESS
        self.PORT = PORT
        self.BUFSIZE = 1024
        self.ADDR = (gethostbyname(self.ADDRESS), self.PORT)
        print(self.ADDR)
        # bind
        self.udpServSock = socket(AF_INET, SOCK_DGRAM)
        self.udpServSock.bind(self.ADDR) # HOST, PORTでbinding

    def run(self):
        while True:
            try:
                # データ受信
                data, self.addr = self.udpServSock.recvfrom(self.BUFSIZE)
                if len(data) > 0:
                    print("receive {} bytes".format(len(data)))
                    print("received data: {}".format(data))
                # OSCはデコードできなくてexceptionが起こる
                # JSONだとテキストなのでデコードできる
                self.data = data.decode()
                print("decoded data: {}".format(self.data))
            except:
                print("exception occrurred")
                #pass

def start_UDP_server(ip_address, port_number):
    print("starting on address {}, port {}".format(ip_address, port_number))
    th = ServerThread(ip_address, port_number)
    th.setDaemon(True)
    th.start()

    while True:
        time.sleep(1.0)
        if not th.data:
            continue
        print(th.data)

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--ip", default="127.0.0.1",
                        help="IP address to listen on")
    parser.add_argument("--port", type=int, default=30000,
                        help="port to listen on")
    args = parser.parse_args()
    start_UDP_server(args.ip, args.port)

mac側で,ターミナル上でプログラムを以下のように立ち上げると,mac側では以下のように表示される.

% ./UDPserver1.py --ip 172.20.10.4 --port 30000
starting on address 172.20.10.4, port 30000
('172.20.10.4', 30000)
receive 4 bytes
received data: b'abcd'
decoded data: abcd
abcd
receive 4 bytes
received data: b'abcd'
decoded data: abcd
abcd
receive 4 bytes
received data: b'abcd'
decoded data: abcd
abcd
^C


一方,Arduino側のシリアルモニタでは以下のように表示される.

Serial setup done
WiFi setup start
start_connect
.......CONNECTED!
WiFi setup done
abcd
abcd
abcd


参照ページ:



0 件のコメント:

コメントを投稿