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 件のコメント:
コメントを投稿