« ESP8266のHelloServerちょろ変えでTOUTピンデータ表示 | トップページ | ESP8266のTOUTピンの電圧をちゃんと測定する方法 »

2015年7月18日 (土)

ESP8266WebServerが遅いわけ

ESP8266WebServerが遅いわけ

2015/9/1 現在 Arduino IDE と ESP8266 をインストールすると Arduion IDE 1.6.5 に ESP8266 の 1.6.5-947-g39819f0 がインストールされる。この ESPWebServer.cpp では

void ESP8266WebServer::sendContent(String content) は下記でコメントアウトしたコード部分が削除されている。

void ESP8266WebServer::send(int code, const char* content_type, const String& content) は sendHeader("Content-Length", len.c_str()); のみ対処している。

以上により以下の記述(2秒のタイムアウトの処理)は ESP8266 1.6.5-947-g39819f0 で対応済みと考えられる。

ESP8266のArduino IED用のSDWebServerスケッチの動作が極めて遅い。
SDカードのアクセスモードが古いの使っているからと遅いのかとずっと思っていました。
そこでSDカードのアクセス速度を計測してみるとぜんぜん遅くない。
Webサーバの応答が2秒以上かかっているのにSDカードのアクセスは40mSec以下処理していた。
そこでSDWebServerスケッチのloop()から時間のを計り始めた。
そしてスケッチの中のserver.send()の呼び出しで時間がかかっていた。
そしてC:\Users\xxxxx\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.4-673-g8cd3697\libraries\ESP8266WebServer\src\ESP8266WebServer.cppのsendContent()の赤字部分で2秒止まっている事を突き止めた。

void ESP8266WebServer::sendContent(String content) {
  size_t size_to_send = content.length();
  size_t size_sent = 0;
  while(size_to_send) {
    const size_t unit_size = HTTP_DOWNLOAD_UNIT_SIZE;
    size_t will_send = (size_to_send < unit_size) ? size_to_send : unit_size;
    size_t sent = _currentClient.write(content.c_str() + size_sent, will_send);
    size_to_send -= sent;
    size_sent += sent;
    if (sent == 0) {
      break;
    }
  }
  uint16_t maxWait = HTTP_MAX_CLOSE_WAIT;
  while(_currentClient.connected() && maxWait--) {
    delay(1);
  }

}

このコードはクライアントが接続が切れるか2秒待つで、いつもタイムアウトの2秒待っている感じです。
ここはsend()の最後に呼び出されている。でもスケッチからsend()を読んだ後にsendContentを呼び出すこともある。ここで2秒待つのはちょっとおかしいのでは?
ということでこの4行をコメントアウト

//  uint16_t maxWait = HTTP_MAX_CLOSE_WAIT;
//  while(_currentClient.connected() && maxWait--) {
//    delay(1);
//  }

以上で普通の速度(これまでに比べると高速)で動くWebServerになりました。

ESP8266WebServer.cppもう一か所、以下の3行をコメントアウトしてます。
本当は正しく書きなおさなければいけないのですがちょっと面倒なのでコメントアウトでごまかしています。

void ESP8266WebServer::send(int code, const char* content_type, String content) {
  String response = "HTTP/1.1 ";
  response += String(code);
  response += " ";
  response += _responseCodeToString(code);
  response += "\r\n";

  if (!content_type)
    content_type = "text/html";

  String len(content.length());
  sendHeader("Content-Type", content_type, true);
//  sendHeader("Content-Length", len.c_str());
//  sendHeader("Connection", "close");
//  sendHeader("Access-Control-Allow-Origin", "*");

  response += _responseHeaders;
  response += "\r\n";
  response += content;
  _responseHeaders = String();
  sendContent(response);
}

さぁてと、時間計測コードで汚した所を戻さなくては!

« ESP8266のHelloServerちょろ変えでTOUTピンデータ表示 | トップページ | ESP8266のTOUTピンの電圧をちゃんと測定する方法 »

Arduino」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/569662/61899715

この記事へのトラックバック一覧です: ESP8266WebServerが遅いわけ:

« ESP8266のHelloServerちょろ変えでTOUTピンデータ表示 | トップページ | ESP8266のTOUTピンの電圧をちゃんと測定する方法 »