何言ってるか分からないと思いますが。
いろいろ困ったちゃんだったWiFiClient
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で取得してみる
シリアルモニタを見てみる。
最初はいい感じに取得できているが・・・
なぜか、最後は尻切れになって終了。 HTMLのHeaderが終わった直後くらいで切れているので、データとしてはあまり取得できていません。
HTTPClientで取得してみる
やっぱりHTTPClientですね。
ResponseのHeaderは見ることはできないものの、いい感じに取得できています。
そして、HTMLも最後の</html>
まで取得できています。ちょっとHTTPClient、いい感じなので当面こちらを使ってみようと思います。