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

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

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

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Arduino

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

Q&A

4回答

1464閲覧

ESP-wroom-02間でルーターを介したUDP通信に失敗する

Minnie

総合スコア12

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

Arduino

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

0グッド

0クリップ

投稿2018/10/31 07:10

ESP-wroom-02(ESP8266)2台を使ってルーター経由でWiFiUDP通信をしようとしています。

(将来的にやりたいこととしては、無線でPCから数メートル先にあるセンサからセンサ値を取得し、その値に応じてPCで処理を行った後、また他の無線で接続されたオブジェクトのモーターを動かそうと思っています。)

こちらのリンクをコピペ(下のコード)で動かした所、ボタン入力からclient側でUDP.writeが正しく行われていることは確認できました。しかし、Server側で適宜printしてデバッグしたところ、UD.ParsePacket()=0になっており、rcvWiFiのループに入れていませんでした。
受信に失敗しているようですが、原因が思い当たりません。どなたか原因のわかる方がいらっしゃいましたらご教授いただけますと幸いです。

Client側コード

arduino

1#include <ESP8266WiFi.h> 2#include <WiFiClient.h> 3#include <WiFiUDP.h> 4 5// UDP settings 6WiFiUDP UDP; 7 8// WiFi settings 9IPAddress HOSTIP (192, 168, 4, 1); 10IPAddress myIP(192, 168, 4, 2); 11const char *ssid = "*"; 12const char *password = "*"; 13 14const int btn1 = 4; 15const int btn2 = 5; 16const int btn3 = 12; 17const int btn4 = 2; 18 19const int ledPin = 16; 20const int wifiStatusPin = 13; 21 22void connectWiFi() { 23 WiFi.begin(ssid, password); 24 WiFi.config(myIP, WiFi.gatewayIP(), WiFi.subnetMask()); 25 26 Serial.println("start_connect"); 27 while (WiFi.status() != WL_CONNECTED) { 28 delay(500); 29 Serial.print("."); 30 } 31 Serial.println("CONNECTED!"); 32 digitalWrite(wifiStatusPin, HIGH); 33} 34 35void setup() { 36 Serial.begin(115200); 37 38 pinMode(ledPin, OUTPUT); 39 pinMode(wifiStatusPin, OUTPUT); 40 41 pinMode(btn1, INPUT_PULLUP); 42 pinMode(btn2, INPUT_PULLUP); 43 pinMode(btn3, INPUT_PULLUP); 44 pinMode(btn4, INPUT_PULLUP); 45 46 delay(500); 47 digitalWrite(ledPin, HIGH); 48 49 Serial.println("-"); 50 Serial.println("start"); 51 WiFi.mode(WIFI_STA);//重要! 52 UDP.begin(893); 53 connectWiFi(); 54} 55 56void sendWiFi(char byteData[]) { 57 if (UDP.beginPacket(HOSTIP, 893)) { 58 UDP.write(byteData); 59 UDP.endPacket(); 60 Serial.println(byteData); 61 } 62} 63 64void loop() { 65 char b[4]; 66 b[0] = (digitalRead(btn1)) ? '1' : '0'; 67 b[1] = (digitalRead(btn2)) ? '1' : '0'; 68 b[2] = (digitalRead(btn3)) ? '1' : '0'; 69 b[3] = (digitalRead(btn4)) ? '1' : '0'; 70 Serial.println(b); 71 72 sendWiFi(b); 73 74 delay(17); 75 end_loop(); 76} 77 78void end_loop(){ 79 if (WiFi.status() != WL_CONNECTED) { 80 WiFi.disconnect(); 81 digitalWrite(wifiStatusPin, LOW); 82 Serial.println("disconnect!"); 83 connectWiFi(); 84 } 85}

Server側コード

Arduino

1#include <ESP8266WiFi.h> 2#include <WiFiClient.h> 3#include <WiFiUDP.h> 4 5// Variable setting 6char WiFibuff[4]; 7 8// UDP setting 9WiFiUDP UDP; 10 11// WiFi setting 12IPAddress myIP(192, 168, 4, 1); 13const char *ssid = "*"; 14const char *password = "*"; 15 16//led 17const int ledPin = 16; 18const int led1 = 4; 19const int led2 = 5; 20const int led3 = 12; 21const int led4 = 2; 22 23void setup() { 24 Serial.begin(115200); 25 26 pinMode(ledPin, OUTPUT); 27 pinMode(led1, OUTPUT); 28 pinMode(led2, OUTPUT); 29 pinMode(led3, OUTPUT); 30 pinMode(led4, OUTPUT); 31 32 WiFi.mode(WIFI_AP); 33 WiFi.softAP(ssid, password); 34 WiFi.config(myIP, WiFi.gatewayIP(), WiFi.subnetMask()); 35 UDP.begin(893); 36 37 digitalWrite(ledPin, HIGH); 38 Serial.println("UDP.begin!"); 39} 40 41void rcvWiFi() { 42 UDP.read(WiFibuff, 4); 43 Serial.print(WiFibuff); 44 UDP.flush(); 45} 46 47void loop() { 48 if (UDP.parsePacket() > 0) { 49 rcvWiFi(); 50 51 if(WiFibuff[0] == '0') { digitalWrite(led1, HIGH); } else { digitalWrite(led1, LOW); } 52 if(WiFibuff[1] == '0') { digitalWrite(led2, HIGH); } else { digitalWrite(led2, LOW); } 53 if(WiFibuff[2] == '0') { digitalWrite(led3, HIGH); } else { digitalWrite(led3, LOW); } 54 if(WiFibuff[3] == '0') { digitalWrite(led4, HIGH); } else { digitalWrite(led4, LOW); } 55 } 56}

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

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

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

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

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

guest

回答4

0

サーバー側コードがAPモードになってますが、
サーバーがアクセスポイントとして動いているならルーターいらなくないですか?

コピペ元のネットワーク構成は、アクセスポイントであるサーバーにクライアントが直接接続する形です。

そのあたり勘違いしてルーターのssidとパスをコードに書いてたりしませんか?

ルーター介したいならどちらもSTAモードです。

投稿2018/10/31 11:56

編集2018/10/31 12:01
ozwk

総合スコア13521

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

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

Minnie

2018/10/31 16:29

ご回答ありがとうございます、完全に勘違いしていました。これは片方をアクセスポイントにしている形なんですね、きちんと読めていませんでした。ご回答をうけ、 ①SSIDとパスを適当に同じものにする(clientはSTA、serverはAPモードのまま) ②SSIDとパスはルーターと同じものにし、両方STAモードにする の2通りを試しましたがどちらもうまく行かず…初心者で理解が深くない故の質問かと思いますが、こちら解決方法ありましたらぜひご教授いただきたいです。よろしくお願いいたします。
guest

0

ルーターでは、WiFi接続した機器間で通信を制限する設定がある場合がありますので、確認が必要です。

投稿2018/10/31 07:49

Harahira

総合スコア243

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

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

Minnie

2018/10/31 08:14

ご回答ありがとうございます。なるほど、そうなんですね。どのように確認するのでしょうか…?重ねてのご質問申し訳ありません。
Harahira

2018/10/31 08:23

ルータによって違いますので、何とも言えません。 ご自分のルータならマニュアルを、会社等のルータなら管理者に相談してみてください。
Minnie

2018/10/31 09:49

承知しました。ご丁寧な回答をどうもありがとうございました。
guest

0

なんか問題の多そうなコードですが、、

IPアドレスなんか、リンク先のをそのまま持ってきてますが、Wifiルータのネットワーク設定周りで、ブッキングしてるとかはないでしょうか。
まずはその2つのデバイスだけでWifiルータを動かしてみては。

投稿2018/10/31 07:27

y_waiwai

総合スコア87774

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

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

Minnie

2018/10/31 08:17

ご回答ありがとうございます。他の機器では使用せず、ローカルでwroom-02だけで使用しているのでおそらくないとは思いますが、確認してみようと思います。
guest

0

こんにちは、私も似たような構成でUDP通信をしているのですが、結果はどうなったのでしょうか。
気になります。よろしくお願い申し上げます。

投稿2019/01/15 05:53

Chocoball

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問