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
参照ページ:
- https://qiita.com/7of9/items/a61999a914ae02673b8d
- http://tc96.hatenablog.com/entry/2016/09/14/130932
0 件のコメント:
コメントを投稿