前提・実現したいこと
ESP32をアクセスポイントモードで使用し、内部に立てたTCPサーバと、クライアントモードで動作する2台のESP32と同時にデータをやり取りしたい。
発生している問題・エラーメッセージ
サーバーからメッセージを接続中の2台のクライアントに送信する際、1台のみにしか送信できず。
ESP32のAPモードの仕様
前世代のESP8266では、softAPモードと称したWi-FiDirectモードであったらしく、32については情報を得られず。
該当のソースコード
Arduino
1/* 2 * アクセスポイント側 3 * サーバーからクライアントに文字を送信してみる 4 */ 5 6#include <WiFi.h> 7 8static const char *WIFI_SSID = "WROOM32"; 9static const char *WIFI_PASS = "password"; 10 11//サーバー設定------------------------------------------------- 12IPAddress ip(192, 168, 1, 10); 13WiFiServer server(1337); //Port番号 14//------------------------------------------------------------- 15 16void setup() { 17 Serial.begin(115200); 18 19 //Wi-Fiアクセスポイント開始-------------------------------------------------------- 20 WiFi.mode(WIFI_AP); 21 WiFi.softAP(WIFI_SSID, WIFI_PASS); 22 WiFi.softAPConfig(ip, WiFi.gatewayIP(), WiFi.subnetMask()); 23 //WiFi.softAPConfig(ip, gateway, netmask); 24 server.begin(); 25 26 IPAddress myIP = WiFi.softAPIP(); 27 Serial.println("APStarted. myIP Address:"); 28 Serial.println(myIP); 29 Serial.print("server Mac Address: "); 30 Serial.println(WiFi.macAddress()); 31 Serial.print("Subnet Mask: "); 32 Serial.println(WiFi.subnetMask()); 33 Serial.print("Gateway IP: "); 34 Serial.println(WiFi.gatewayIP()); 35 //------------------------------------------------------------------------------ 36 delay(500); 37} 38 39void loop() { 40 WiFiClient client = server.available(); 41 42 if(client > 0){ 43 Serial.println("newclient"); 44 while(client.connected()){ 45 client.println("println"); 46 delay(1000); 47 client.println("\n"); 48 } 49 } 50 client.stop(); 51 Serial.println("client disconnected"); 52 } 53 54 55/* 56 * クライアント側 57 * サーバーから文字を受け取って表示してみる 58 */ 59 60#include <WiFi.h> 61 62#define WIFI_SSID "WROOM32" 63#define WIFI_PASS "password" 64//接続先設定 65const uint16_t port = 1337; //接続するサーバのポート 66const char * host = "192.168.1.10"; // 接続するipもしくはdns 67 68void setup() { 69 Serial.begin(115200); 70//Wi-Fi接続---------------------------------------------------------------------- 71 WiFi.begin( WIFI_SSID, WIFI_PASS ); 72 Serial.println("Connecting Wifi..."); 73 while (WiFi.status() != WL_CONNECTED) { 74 delay(500); 75 Serial.print("."); 76 } 77 Serial.println(""); 78 Serial.print("IP address: "); 79 Serial.println(WiFi.localIP()); 80 Serial.print("STA Mac Address: "); 81 Serial.println(WiFi.macAddress()); 82 Serial.print("Subnet Mask: "); 83 Serial.println(WiFi.subnetMask()); 84 Serial.print("Gateway IP: "); 85 Serial.println(WiFi.gatewayIP()); 86//------------------------------------------------------------------------------ 87 delay(500); 88 89} 90 91void loop() { 92 WiFiClient client; 93 Serial.print("Connecting to "); 94 Serial.println(host); 95 if(!client.connect(host, port)){ 96 Serial.println("Connection failed."); 97 Serial.println("Waiting 5 seconds before retrying..."); 98 delay(5000); 99 return; 100 } 101 102 String rstr; 103 if(client > 0){ 104 if(client > 0){ // サーバーに接続され、読み取り可能なデータがあるクライアントを取得した場合実行 105 Serial.println("NewClient"); 106 while(client.connected()){ // クライアントが接続されている間実行 107 if(client.available()){ // クライアントから読み込み可能なバイトがある場合実行 108 rstr = client.readStringUntil('\n'); // データを読み込む。\nを受信すると読み込み終了し再度読み込みへループする 109 Serial.print("["); 110 Serial.print(rstr); // 読み込んだデータをシリアル表示 111 Serial.println("]"); 112 } 113 } 114 } 115 116 //---------------------------------------------------------------------------- 117} 118}
試したこと
・当初は複数のクライアントから、AP兼サーバーのESP32に文字を送るものを作っていたが例によって1台分しか表示できず、ネット上の情報でシリアル通信が衝突している可能性が指摘されていたので、送受信を逆にしたが解決できず。
補足情報(FW/ツールのバージョンなど)
クライアント2台とも、APに接続できてはいるが情報の受信が一台のみしか行われない。
APのチャンネルを2つ(1ch, 5ch)指定し、クライアントそれぞれに接続するチャンネルを指定したが解決せず
TCPでなくUDPで行えば解決しましたが、TCPで不可能な技術的な理由(ArduinoIDEで実現できる方法があるのか)がわからないので、しばらく残させていただきます。
回答2件
あなたの回答
tips
プレビュー