Androidのメモとか

ポキオの日記です。今日も遅延してない。

ESP8266でHTTP GETするならWiFiClientじゃなくてHTTPClientのほうが良い

何言ってるか分からないと思いますが。

ESP8266

いろいろ困ったちゃんだったWiFiClient

relativelayout.hatenablog.com

ESP8266触る上で、やっぱりやりたくなるのがHTTP GET。以前、京急の運行情報のページをHTTP GETする際に使っていたのがWiFiClient。別に意識していたわけではなく、たまたまサンプルコードがWiFiClientだったので、それを使っていました。

しかし、一つ問題があって、GETするPayloadが長すぎると途中で途切れてしまう問題。これが厄介で、ワークアラウンドとしてRangeを指定してGETするPayloadを小さく、特定の部分だけ返してもらうようなRequestを投げるようにしていました。

便利で、デキる子、HTTPClient

たまたまネットを見ていたら、HTTPClientなるものを見つけ、なんとなく使ってみたらいい感じでした。インスタンスの初期化も簡単だし、とにかくRequestのHeaderも特に記載しなくてもGETできるので素敵です。

とりあえず、コードで書いてみました。

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

char ssid[] = "XXXXXXXX";
char password[] = "YYYYYYYY";

void setup() {
  Serial.begin(115200);
  Serial.println("");

  connectWifi();

  String result1 = getPageSource1("http://unkou.keikyu.co.jp/");
  Serial.println(result1);

  String result2 = getPageSource2("unkou.keikyu.co.jp");
  Serial.println(result2);

  disconnectWifi();
}

void loop() {

}

void connectWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(100);
  }

  Serial.println("connected!");
}

void disconnectWifi() {
  WiFi.disconnect();
  Serial.println("disconnected!");
}

String getPageSource1(char host[]) {
  HTTPClient http;

  http.begin(host);
  int httpCode = http.GET();

  String result = "";

  if (httpCode < 0) {
    result = http.errorToString(httpCode);
  } else if (http.getSize() < 0) {
    result =  "size is invalid";
  } else {
    result = http.getString();
  }

  http.end();
  return result;
}

String getPageSource2(char host[]) {
  WiFiClient client;

  if ( !client.connect(host, 80) ) {
    return String("");
  }

  client.print(String("GET ") + "/" +
               " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  client.println();

  delay(1000);

  String body = "";

  while (client.available()) {
    body += client.readStringUntil('\r');
  }

  return body;
}

getPageSource1()はHTTPClientでGETし、getPageSource2()はWiFiClientで京急の運行情報を取得するコードにしてみました。

WiFiClientで取得してみる

シリアルモニタを見てみる。

ESP8266

最初はいい感じに取得できているが・・・

ESP8266

なぜか、最後は尻切れになって終了。 HTMLのHeaderが終わった直後くらいで切れているので、データとしてはあまり取得できていません。

HTTPClientで取得してみる

やっぱりHTTPClientですね。

ESP8266

ResponseのHeaderは見ることはできないものの、いい感じに取得できています。

ESP8266

そして、HTMLも最後の</html>まで取得できています。ちょっとHTTPClient、いい感じなので当面こちらを使ってみようと思います。

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。