質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

解決済

2回答

1304閲覧

ESPr Developer(ESP-WROOM-02)とUnityをwifiで接続したい

KEEL

総合スコア52

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2018/05/22 07:53

編集2018/05/23 07:07

実現したいこと

ESPrDeveloperをArduino化し、アクセスポイントとしてESPrDeveloperのTOUTから読んだアナログ入力の値をWiFiを経由してUnityに渡したいです。

問題点

ESPrDeveloper[ESPr® Developer(ESP-WROOM-02開発ボード]はアクセスポイントとしてPCから接続できるが、識別されていないネットワークとして表示される。
またnetstat -anコマンドで見ても存在を確認できない。
Unity側でUDPClientから何も受信されない。

Arduino

1#include <ESP8266WiFi.h> 2#include <WiFiUDP.h> 3extern "C" { 4#include "user_interface.h" 5} 6 7//Access Point Setting 8const char *APSSID = "ESP_WROOM_02"; 9const char *APPASS = "hoge4444"; 10unsigned int localPort = 22222; 11 12WiFiUDP UDP; 13char packetBuffer[255]; 14 15static const char *udpReturnAddr = "192.168.144.100"; 16static const int udpReturnPort = 22223; 17 18void setup() { 19 20 Serial.begin(115200); 21 Serial.println(); 22 23 WiFi.softAP(APSSID, APPASS); 24 25 IPAddress myIP = WiFi.softAPIP(); 26 Serial.print("AP IP address: "); 27 Serial.println(myIP); 28 UDP.begin(localPort); 29} 30 31void loop() { 32 if(WiFi.softAPgetStationNum() >= 1) 33 { 34 uint ADC_Value = 0; 35 ADC_Value = system_adc_read(); 36 delay(3); 37 String str = String(ADC_Value) ; 38 int a = str.length(); 39 char msg[a+1]; 40 str.toCharArray(msg, a+1); 41 42 UDP.beginPacket(udpReturnAddr, udpReturnPort); 43 UDP.write(msg, a+1); 44 UDP.endPacket(); 45 } 46}

ESPrDeveloperの設定は以下の通りです。また電源はESPrDeveloperを有線でPCに接続したものを使用しています。
設定

Unity側の受信コードは以下の通りです。LOCAL_PORTには22223を入力し実行しています。

C#

1using UnityEngine; 2using System.Collections; 3using System.Net; 4using System.Net.Sockets; 5using System.Text; 6using System.Threading; 7using UnityEditor; 8 9public class UDPReceive : MonoBehaviour 10{ 11 public int LOCAL_PORT; 12 public string ESP_ADDRESS; 13 static UdpClient udp; 14 Thread thread; 15 16 void Start() 17 { 18 udp = new UdpClient(LOCAL_PORT); 19 udp.Client.ReceiveTimeout = 1000; 20 thread = new Thread(new ThreadStart(ThreadMethod)); 21 thread.Start(); 22 } 23 24 void Update() 25 { 26 Debug.Log(udp.Available); 27 } 28 29 void OnApplicationQuit() 30 { 31 thread.Abort(); 32 udp.Close(); 33 } 34 35 private static void ThreadMethod() 36 { 37 while (true) 38 { 39 IPEndPoint remoteEP = null; 40 byte[] data = udp.Receive(ref remoteEP); 41 string text = Encoding.ASCII.GetString(data); 42 Debug.Log(text); 43 } 44 } 45 46}

試したこと

ESP8266のスケッチ例WiFiAccessPointを書き込み実行したところ問題なく機能しました。

wiresharkでのパケットの確認

ESPrDeveloper側のコードを以下のように改変し、wiresharkでWiFiにどんなパケットが流れているか確認しました。

Arduino

1#include <ESP8266WiFi.h> 2#include <WiFiUdp.h> 3extern "C" { 4#include "user_interface.h" 5} 6const char* ssid = "ESP_WROOM_02"; 7const char* password = "hoge4444"; 8 9WiFiUDP UDPTestServer; 10static const char *udpReturnAddr = "192.168.150.64"; 11unsigned int UDPPort = 22222; 12 13const int packetSize = 2; 14byte packetBuffer[packetSize]; 15 16void setup() { 17 Serial.begin(115200); 18 delay(10); 19 20 Serial.println(); 21 Serial.println(); 22 Serial.print("Connecting to "); 23 Serial.println(ssid); 24 25 WiFi.begin(ssid, password); 26 WiFi.config(IPAddress(192, 168, 4, 1), IPAddress(192, 168, 4, 2), IPAddress(255, 255, 255, 0)); 27 28 while (WiFi.softAPgetStationNum() <= 0) { 29 delay(500); 30 Serial.print("."); 31 } 32 33 Serial.println(""); 34 Serial.println("WiFi connected"); 35 Serial.print("IP address: "); 36 Serial.println(WiFi.localIP()); 37 38 IPAddress myIP = WiFi.softAPIP(); 39 Serial.print("AP IP address: "); 40 Serial.println(myIP); 41 42 byte mac[6]; 43 WiFi.macAddress(mac); 44 char buf[20]; 45 Serial.print("MAC address: "); 46 sprintf(buf,"%02X:%02X:%02X:%02X:%02X:%02X",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); 47 Serial.print(buf); 48 sprintf(buf," %02x%02x%02x%02x%02x%02x",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); 49 Serial.println(buf); 50 UDPTestServer.begin(UDPPort); 51 52} 53 54int value = 0; 55 56void loop() 57{ 58 if(WiFi.softAPgetStationNum() <= 0) 59 { 60 delay(500); 61 Serial.print("."); 62 } 63 else 64 { 65 handleUDPServer(); 66 } 67 delay(1); 68} 69 70void handleUDPServer() 71{ 72 uint ADC_Value = 0; 73 ADC_Value = system_adc_read(); 74 String str = String(ADC_Value) ; 75 int a = str.length(); 76 char msg[a+1]; 77 str.toCharArray(msg, a+1); 78Serial.print("."); 79 UDPTestServer.beginPacket(udpReturnAddr, UDPPort); 80 UDPTestServer.write(msg, a+1); 81 UDPTestServer.endPacket(); 82 delay(3); 83}

結果は以下のようになりUDPパケットは流れず、ARPパケットやICMPパケットが多くみられました。
![イイメージ説明

送信元IP192.168.4.1
イメージ説明

送信元IP192.168.4.2
イメージ説明
イメージ説明

環境

Unity2017.3.0f3
Arduino1.8.5
ESP8266 Ver2.4.1

参考にしたサイト

UnityでUDPを受信してみる
ESP8266にArduinoスケッチを書き込んでUDPデータ送受信

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

出来たので自己解決手段を書いておきます。
結論から行くとUnity側のコードが悪かったことが原因でした。
UDPClientでRecieveではなくBiginRecieveを用いることで受け取りができるようになりました。
Recieveを用いるとthread.Abortが機能せず、Unity上でゾンビスレッドが発生するようで1回目の実行では問題ないのですが2回目の実行時にUnityがクラッシュします。
以下にコードを貼っておきます。

cs

1using System; 2using System.Collections; 3using System.Net; 4using System.Net.Sockets; 5using System.Text; 6using System.Threading; 7using UnityEngine; 8 9public class UDPServer : MonoBehaviour 10{ 11 [SerializeField] int LOCAL_PORT = 8888; 12 [SerializeField] string host = "224.0.0.251"; 13 UdpClient udp; 14 Thread thread; 15 16 void Start() 17 { 18 udp = new UdpClient(LOCAL_PORT); 19 thread = null; 20 thread = new Thread(new ThreadStart(ThreadMethod)); 21 thread.IsBackground = true; 22 thread.Start(); 23 } 24 25 void OnApplicationQuit() 26 { 27 try 28 { 29 thread.Abort(); 30 } 31 catch 32 { 33 Debug.Log("Thread Abording Failed"); 34 } 35 Debug.Log(thread); 36 Debug.Log(thread.IsAlive); 37 } 38 39 private void ThreadMethod() 40 { 41 Thread.Sleep(10); 42 try 43 { 44 byte[] dgram = Encoding.UTF8.GetBytes("hello world!"); 45 IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(host), LOCAL_PORT); 46 udp.BeginSend(dgram, dgram.Length, remoteEP, new AsyncCallback(send), udp); 47 udp.BeginReceive(new AsyncCallback(recv), udp); 48 Debug.Log("Bigin Receiving UDP Packets"); 49 } 50 catch 51 { 52 Debug.Log("UDP Connection Error"); 53 } 54 } 55 void send(IAsyncResult result) 56 { 57 udp.EndSend(result); 58 Debug.Log("send UDP packet"); 59 } 60 void recv(IAsyncResult result) 61 { 62 Debug.Log("receive UDP packet"); 63 IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, LOCAL_PORT); 64 byte[] received = udp.EndReceive(result, ref remoteEP); 65 66 Debug.Log(Encoding.UTF8.GetString(received)); 67 udp.BeginReceive(new AsyncCallback(recv), null); 68 } 69}

投稿2018/11/09 05:06

KEEL

総合スコア52

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Unity側でUDPの通信コードを組めばいい、というはなしですね。
「Unity UDP送受信」でぐぐるとでてきますねー

投稿2018/05/22 08:12

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KEEL

2018/05/22 08:15

Unity側のコードを修正する必要があると言うことでしょうか?Unity側からなにか送信しなければesp8266 はなにも送ってこないのですか?
y_waiwai

2018/05/22 08:20

UDPってのはIPとポートが決め打ちになってるシリアル通信、って感じで使えますんで、どこからでも通信は送れます、が、TCPと違って通信の保証はされないので、他の通信などで邪魔される場合もあります
KEEL

2018/05/22 08:57

できればもう少し詳細な情報をいただきたいのですがUnity側のコードまたはESPrDeveloper側のコードで修正するべき点や設定、電源などに問題はないのでしょうか? また情報が不足しているのであればご指摘いただけると助かります。
y_waiwai

2018/05/22 09:11

まずはAlduino側で一定のメッセージをUDPとシリアルポートに垂れ流しにしておいて、Wireshakeなどでネットワークモニタで参照できるかやってみればどうでしょう 同時にシリアルポートをターミナルソフトでモニタしておけば生存確認もしておくと。 UDPパケットが送信されているのをそれで確認できたら、あとはUnity側の実装となります
KEEL

2018/05/23 06:32

シリアルモニタでボードの生存確認をしつつwiresharkでWiFiを監視したところUDPパケットではなくARPパケットが多く見受けられました。 質問に追記した情報も含めて返信及びアドバイスを頂けると幸いです。
y_waiwai

2018/05/23 06:52

Arduino側のIPでWireSharkのフィルタをかけてみれ。 他のパケットに埋もれて確認できんw それとシリアル出力の内容も出してみる
KEEL

2018/05/23 07:05

シリアル出力は WiFi connected IP address: 192.168.4.1 AP IP address: 192.168.4.1 MAC address: 5C:CF:7F:90:DF:4A 5ccf7f90df4a ............................................................................... となっています。 送信側IPが192.168.4.1のときは常に192.168.4.2にICMPパケットを送信しており、 送信側IPが192.168.4.1のときは特定のIPや特定のプロトコルで通信しているようには見受けられません。フィルタかけた画像を追記します。
y_waiwai

2018/05/23 07:07

192.168.4.1ってルータのIPやったりしない?
KEEL

2018/05/23 07:11

ipconfigで確認したところそうみたいです Wireless LAN adapter Wi-Fi: 接続固有の DNS サフィックス . . . . .: IPv4 アドレス . . . . . . . . . . . .: 192.168.4.2 サブネット マスク . . . . . . . . . .: 255.255.255.0 デフォルト ゲートウェイ . . . . . . .: 192.168.4.1
y_waiwai

2018/05/23 07:13

そんじゃだめぢゃん。 ルータの設定画面を見て、DHCPの割当範囲外にArduinoのIPを設定する。 そんでやりなおしだ。
y_waiwai

2018/05/23 07:15

できればルータを介さずに、PCとArduinoを1対1でつなげればいいけど、そんじゃやりにくいわな。。
KEEL

2018/05/23 16:59

あー...質問が悪かったですね WiFi(ルータ)を介して繋ぎたいわけではなく単純にArduinoからUDP通信をしてPC側で受け取りたいだけです WiFi connected IP address: 192.168.40.100 AP IP address: 192.168.40.100 MAC address: 5C:CF:7F:90:DF:4A 5ccf7f90df4a このようにIPアドレスを変えてみましたがICMPパケットが送られるだけでUDPパケットは無かったです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問