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

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

ただいまの
回答率

90.49%

  • Arduino

    539questions

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

ESP32のWiFiを用いたサーバー・クライアント相互通信

受付中

回答 1

投稿

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

CyPris

score 3

 前提・実現したいこと

現在二つのesp32で片方はAPモードでサーバーとして、もう片方はクライアントとして通信を試みているのですが、APモードの起動タイミングによって接続しない場合があります。
何か解決法ないでしょうか?

 発生している問題・エラーメッセージ

なし

 該当のソースコード

/*--------------------------------------Server--------------------------------------*/
#include<WiFi.h>
const char *ssid="ESP32-WiFi"; //SSID
const char *pass="esp32wifi"; //パスワード
const IPAddress ip(192,168,0,9);  //サーバーのIPアドレス
const IPAddress subnet(255,255,255,0);  //サブネットマスク
WiFiServer server(80);
#define TIME 30
#define uS 1000*1000
void wifi_ap()
{
  WiFi.softAP(ssid,pass);  //SSIDとパスの設定
  delay(1000); //接続失敗防止
  WiFi.softAPConfig(ip,ip,subnet);  //IPアドレス、ゲートウェイ、サブネットマスクの設定
  IPAddress myIP = WiFi.softAPIP(); //WiFi.softAPIP()でWiFi起動
  server.begin(); //サーバーを起動(htmlを表示させるため)
  /*各種情報を表示*/
  Serial.println("WiFi Information");
  Serial.print("SSID:");
  Serial.println(ssid);
  Serial.print("AP IP address:");
  Serial.println(myIP);
  Serial.println("Server start!");
}
bool message_recive()
{
  //接続したクライアントの情報を得る。
  WiFiClient client = server.available();
  if(client){
    Serial.println("New Client");
    while(client.connected()){
      if(client.available()){
        String line = client.readStringUntil('\r');
        Serial.println(line);
        client.stop();
        return true;
      }
    }
  }
}
void setup()
{
  Serial.begin(115200);
  Serial.println("Program Start");
  esp_sleep_enable_timer_wakeup(TIME * uS);
  wifi_ap();
}

void loop()
{
  if(message_recive()==true)
  {
    WiFi.softAPdisconnect(1);
    delay(1000);
    Serial.println("Light Sleep Start");
    esp_light_sleep_start();
    Serial.println("Wake Up");
    wifi_ap();
  }  
}

/*--------------------------------------Client--------------------------------------*/
#include<WiFi.h>
const char *ssid="ESP32-WiFi"; //サーバーのSSID
const char *pass="esp32wifi"; //サーバーのパスワード
static WiFiClient client; //WiFiClient型でclientと宣言
#define TIME 10
#define uS 1000*1000
/*-------------サーバーとWiFi接続-------------*/
bool server_connect()
{
  int try_count = 0;
  WiFi.disconnect();
  WiFi.begin(ssid, pass); //サーバーに接続
  delay(1000);

  while (WiFi.status() != WL_CONNECTED&&try_count<10)
  {
    try_count++;
    Serial.print(".");
    delay(1000);
  }
  if(WiFi.status()==WL_CONNECTED)
  {
    Serial.println("WiFi Connected");
    IPAddress ip(192, 168, 0, 9); //サーバーのIPアドレス
    client.connect(ip, 80); //IPアドレスとポート番号を指定して接続
    return true;
  }
  else if(try_count == 10)
  {
    Serial.println("WiFi Connection:False");
    WiFi.disconnect();
    delay(100);
    return false;
  }
}
void connect_try()
{
  Serial.println("●WiFi Connnect Start");
  int try_count = 0;
  while(server_connect()!=true&&try_count<5)
  {
    try_count++;
    delay(1000);
  }
  if(try_count==5)
  {
    Serial.println("False");
  }
}
void setup()
{
  Serial.begin(115200);
  Serial.println("Program Start");
  esp_sleep_enable_timer_wakeup(TIME * uS);
  connect_try();
}

void loop()
{
  //サーバーに接続されたか確認
  if(client.connected()==true)
  {
    Serial.println("Massage Send");
    client.println("Hello");
    client.stop();
    WiFi.disconnect();
    esp_deep_sleep_start();
  }

}

 試したこと

何度かWiFi.desconnectで一度切断し、WiFi.begin接続しなおすエラーチェック文を追加しました。

 補足情報(FW/ツールのバージョンなど)

電源を入れた場合にはどんなタイミングでも接続されるのですが、
sleep後には上手くいかないので、通信後に接続が切れていないことが問題だと思われます。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2018/06/18 11:46

    ESP32を接続したArduinoを2台の構成ですか? 「電源を入れた場合にはどんなタイミングでも」というのは2台(サーバ、クライアント)のArduinoの電源投入の順序の事ですか??

    キャンセル

  • CyPris

    2018/06/18 14:18

    いえ、ESP32 DevKitを二台用いた構成です。「電源を入れた場合にはどんなタイミングでも」はおっしゃる通りの意味で、ESP32 DevKitの電源投入の順序のことです。

    キャンセル

  • coco_bauer

    2018/06/18 15:43

    カテゴリーがArduinoになっていますが、Arduinoは使われていないという事ですか?

    キャンセル

  • CyPris

    2018/06/18 15:47

    arduino ideを用いたからです。

    キャンセル

回答 1

0

まずはPCを相手にやってみればどうでしょう
PCをサーバに、Arduinoをクライアントに、
Arduinoをサーバに、PCをクライアントに。
そこらへんいろいろやってると不具合点、問題点がわかってくると思います

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Arduino

    539questions

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