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

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

ただいまの
回答率

90.48%

  • Arduino

    689questions

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

  • UDP

    74questions

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

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

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 619

Minnie

score 4

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

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

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

Client側コード

#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <WiFiUDP.h>

// UDP settings
WiFiUDP UDP;

// WiFi settings
IPAddress HOSTIP (192, 168, 4, 1);
IPAddress myIP(192, 168, 4, 2);
const char *ssid = "*";
const char *password = "*";

const int btn1 = 4;
const int btn2 = 5;
const int btn3 = 12;
const int btn4 = 2;

const int ledPin = 16;
const int wifiStatusPin = 13;

void connectWiFi() {
  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!");
  digitalWrite(wifiStatusPin, HIGH);
}

void setup() {
  Serial.begin(115200);

  pinMode(ledPin, OUTPUT);
  pinMode(wifiStatusPin, OUTPUT);

  pinMode(btn1, INPUT_PULLUP);
  pinMode(btn2, INPUT_PULLUP);
  pinMode(btn3, INPUT_PULLUP);
  pinMode(btn4, INPUT_PULLUP);

  delay(500);
  digitalWrite(ledPin, HIGH);

  Serial.println("-");
  Serial.println("start");
  WiFi.mode(WIFI_STA);//重要!
  UDP.begin(893);
  connectWiFi();
}

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

void loop() {
  char  b[4];
  b[0] = (digitalRead(btn1)) ? '1' : '0';
  b[1] = (digitalRead(btn2)) ? '1' : '0';
  b[2] = (digitalRead(btn3)) ? '1' : '0';
  b[3] = (digitalRead(btn4)) ? '1' : '0';
  Serial.println(b);

  sendWiFi(b);

  delay(17);
  end_loop();
}

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

Server側コード

#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <WiFiUDP.h>

// Variable setting
char WiFibuff[4];

// UDP setting
WiFiUDP UDP;

// WiFi setting
IPAddress myIP(192, 168, 4, 1);
const char *ssid = "*";
const char *password = "*";

//led
const int ledPin = 16;
const int led1 = 4;
const int led2 = 5;
const int led3 = 12;
const int led4 = 2;

void setup() {
  Serial.begin(115200);

  pinMode(ledPin, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);

  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid, password);
  WiFi.config(myIP, WiFi.gatewayIP(), WiFi.subnetMask());
  UDP.begin(893);

  digitalWrite(ledPin, HIGH);
  Serial.println("UDP.begin!");
}

void rcvWiFi() {
  UDP.read(WiFibuff, 4);
  Serial.print(WiFibuff);
  UDP.flush();
}

void loop() {
  if (UDP.parsePacket() > 0) {
    rcvWiFi();

    if(WiFibuff[0] == '0') { digitalWrite(led1, HIGH); } else { digitalWrite(led1, LOW); }
    if(WiFibuff[1] == '0') { digitalWrite(led2, HIGH); } else { digitalWrite(led2, LOW); }
    if(WiFibuff[2] == '0') { digitalWrite(led3, HIGH); } else { digitalWrite(led3, LOW); }
    if(WiFibuff[3] == '0') { digitalWrite(led4, HIGH); } else { digitalWrite(led4, LOW); }
  }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/01 01:29

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/31 17:17

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/31 17:14

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

    キャンセル

  • 2018/10/31 17:23

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

    キャンセル

  • 2018/10/31 18:49

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Arduino

    689questions

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

  • UDP

    74questions

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