18504


ESP-WROOM-02をArduino IDE
1.6.5でプログラムする環境において、サンプルスケッチのESP8266WiFi/WiFiClient.ino
サンプルを流用してJSON文字列をHTTPでGETするプログラムを書いているのですが、レスポンスヘッダを含めて1360bytes程度までしか取得できず困っています。

一定以上の大きさのリソースは取得できないという制限があるのならば、Web側でCGIなりで加工する実装に切り替えようと思いますが、この1360bytesの制限を変更する方法をご存知の方がいらっしゃいましたら、教えていただければありがたく存じます。

スケッチは以下のようになります。

[code]

    #include <ESP8266WiFi.h>
    
    const char* ssid     = "your-ssid";
    const char* password = "your-password";
    const char* host = "example.com";
    
    void setup() {
      Serial.begin(115200);
      delay(10);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
      }
    }
    
    void loop() {
      delay(5000);
      Serial.print("connecting to ");
      Serial.println(host);
      WiFiClient client;
      const int httpPort = 80;
      if (!client.connect(host, httpPort)) {
        Serial.println("connection failed");
        return;
      }
      String url = "/hugedata.json";
      Serial.print("Requesting URL: ");
      Serial.println(url);
      client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                   "Host: " + host + "\r\n" + 
                   "Connection: close\r\n\r\n");
      delay(10);
      while(client.available()){
        String line = client.readStringUntil('\r');
        Serial.print(line);
      }
    }
    
[/code]

（2015-11-07
02:40追記）アクセス先のVPSサーバでtcpdumpをとったりして試したところ、eth0のMTUを1500から1400（＝MSS：1360）にしたところ、大きなファイルでもESP-
WROOM-02でも8KBのファイルがGETできたので、ESP8266WiFi.hではなくて、回線の問題になると思います。ネットワーク環境を調整して引き続き調査しています。

（2015-11-07 03:24追記）tcpdumpの3way hand
shakeの様子を見ていると、我が家の回線がCATVでMTU=1400のところを、ESP-WROOM-02からのSYNでMSS=1380を要求していました。

  * アクセス先のサーバがMTU=1500（MSS=1460）のときは、SYN+ACKでMSS=1460が提示され、結果としてMSS=1380（MTU=1420）が採用、サーバからCATV回線にパケットが通らないという状態。
  * アクセス先のサーバがMTU=1400（MSS=1360）のときは、SYN+ACKでMSS=1360が提示され、結果としてMSS=1360（MTU=1400）が採用、サーバからCATV回線にパケットが通る。

という切り分けができました。よって、問題は、自宅内のネットワーク環境で、ESP-
WROOM-02がMTU=1420（MSS=1380）を採用する原因を調査することになりました。


CC BY-SA 3.0
2015-11-06T16:17:48.217
18489
2015-11-07T03:43:16.343
2015-11-07T03:43:16.343
12633
12633
question
arduino
ESP8266WiFi.hで1KB超のHTTP_GETが出来ない場合 ネットワークのMTU値/MSSの確認


自己解決しました。

まず、追記で書いたCATV回線のMTU値ですが、実際には1420でした。  
そして、以前自宅の外から出るWAN回線として使っていたWiMAXのMTU値が1400でした。

  * 自宅内ルータは回線が物理的に3回線つながっています。LAN1が自宅内LAN、LAN2がCATV回線によるWAN回線、LAN3がWiMAXルータによるWAN回線です。
  * 今まではLAN3のWiMAXをWAN回線として使っていました。
  * 自宅内ルータの設定をWiMAXに合わせてインタフェースすべてをMTU 1400に設定していました。
  * 最近通常使用のWAN回線をWiMAXからCATV回線に変更しました。
  * MTU は1400のままでした。

以上のような環境で、

  * ルータのMSS書き換えで、CATV回線から外に出るとき、SYNのMSSが1380に（1420-40）
  * 3way hand shakeで、MSSとして1380が採用（MTU 1420：CATV回線は通る）
  * MTUを1400としていたため、GETリクエストの戻りデータが1360byte超えるとMTUの1400の制限に引っ掛かりルータの中に入ってこない

となっていました。

解決法として、まだWiMAX回線をWANに切り替える可能性があるため、

  * すべての回線のMSS書き換えを1360に設定

しました。

これにより、ESP-WROOM-02からのSYNパケットもMSS
1360を要求するようになり、1360bytes以上のデータも正常に分割され、レスポンスとして8KB程度のJSON文書も受信できるようになりました。


CC BY-SA 3.0
2015-11-07T03:41:34.473
18504
2015-11-07T03:41:34.473
12633
18489
answer