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

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

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

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

Q&A

1回答

1717閲覧

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

CyPris

総合スコア11

Arduino

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

0グッド

1クリップ

投稿2018/06/17 15:57

前提・実現したいこと

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

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

なし

該当のソースコード

Arduino

1/*--------------------------------------Server--------------------------------------*/ 2#include<WiFi.h> 3const char *ssid="ESP32-WiFi"; //SSID 4const char *pass="esp32wifi"; //パスワード 5const IPAddress ip(192,168,0,9); //サーバーのIPアドレス 6const IPAddress subnet(255,255,255,0); //サブネットマスク 7WiFiServer server(80); 8#define TIME 30 9#define uS 1000*1000 10void wifi_ap() 11{ 12 WiFi.softAP(ssid,pass); //SSIDとパスの設定 13 delay(1000); //接続失敗防止 14 WiFi.softAPConfig(ip,ip,subnet); //IPアドレス、ゲートウェイ、サブネットマスクの設定 15 IPAddress myIP = WiFi.softAPIP(); //WiFi.softAPIP()でWiFi起動 16 server.begin(); //サーバーを起動(htmlを表示させるため) 17 /*各種情報を表示*/ 18 Serial.println("WiFi Information"); 19 Serial.print("SSID:"); 20 Serial.println(ssid); 21 Serial.print("AP IP address:"); 22 Serial.println(myIP); 23 Serial.println("Server start!"); 24} 25bool message_recive() 26{ 27 //接続したクライアントの情報を得る。 28 WiFiClient client = server.available(); 29 if(client){ 30 Serial.println("New Client"); 31 while(client.connected()){ 32 if(client.available()){ 33 String line = client.readStringUntil('\r'); 34 Serial.println(line); 35 client.stop(); 36 return true; 37 } 38 } 39 } 40} 41void setup() 42{ 43 Serial.begin(115200); 44 Serial.println("Program Start"); 45 esp_sleep_enable_timer_wakeup(TIME * uS); 46 wifi_ap(); 47} 48 49void loop() 50{ 51 if(message_recive()==true) 52 { 53 WiFi.softAPdisconnect(1); 54 delay(1000); 55 Serial.println("Light Sleep Start"); 56 esp_light_sleep_start(); 57 Serial.println("Wake Up"); 58 wifi_ap(); 59 } 60} 61 62/*--------------------------------------Client--------------------------------------*/ 63#include<WiFi.h> 64const char *ssid="ESP32-WiFi"; //サーバーのSSID 65const char *pass="esp32wifi"; //サーバーのパスワード 66static WiFiClient client; //WiFiClient型でclientと宣言 67#define TIME 10 68#define uS 1000*1000 69/*-------------サーバーとWiFi接続-------------*/ 70bool server_connect() 71{ 72 int try_count = 0; 73 WiFi.disconnect(); 74 WiFi.begin(ssid, pass); //サーバーに接続 75 delay(1000); 76 77 while (WiFi.status() != WL_CONNECTED&&try_count<10) 78 { 79 try_count++; 80 Serial.print("."); 81 delay(1000); 82 } 83 if(WiFi.status()==WL_CONNECTED) 84 { 85 Serial.println("WiFi Connected"); 86 IPAddress ip(192, 168, 0, 9); //サーバーのIPアドレス 87 client.connect(ip, 80); //IPアドレスとポート番号を指定して接続 88 return true; 89 } 90 else if(try_count == 10) 91 { 92 Serial.println("WiFi Connection:False"); 93 WiFi.disconnect(); 94 delay(100); 95 return false; 96 } 97} 98void connect_try() 99{ 100 Serial.println("●WiFi Connnect Start"); 101 int try_count = 0; 102 while(server_connect()!=true&&try_count<5) 103 { 104 try_count++; 105 delay(1000); 106 } 107 if(try_count==5) 108 { 109 Serial.println("False"); 110 } 111} 112void setup() 113{ 114 Serial.begin(115200); 115 Serial.println("Program Start"); 116 esp_sleep_enable_timer_wakeup(TIME * uS); 117 connect_try(); 118} 119 120void loop() 121{ 122 //サーバーに接続されたか確認 123 if(client.connected()==true) 124 { 125 Serial.println("Massage Send"); 126 client.println("Hello"); 127 client.stop(); 128 WiFi.disconnect(); 129 esp_deep_sleep_start(); 130 } 131 132} 133

試したこと

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

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

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

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

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

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

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

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

coco_bauer

2018/06/18 02:46

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

2018/06/18 05:18

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

2018/06/18 06:43

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

2018/06/18 06:47

arduino ideを用いたからです。
guest

回答1

0

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

投稿2018/06/18 06:20

y_waiwai

総合スコア87749

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問