ESP8266でHttpのGETリクエストをする
こんにちは、くろべこです。
今回もESP8266の記事になります。
前回はサーバー構築をしましたが、今回はESP8266がクライアント側になりサーバー側にGETリクエストをしてみたいと思います。
ESP8266をクライアントにしてリクエストコマンドを送る方法として、何種類かあると思うのですが、今回は<ESP8266HTTPClient.h>を使用してlivedoorお天気情報の【Weather Hacks】からJSON形式の天気情報をGETしていきたいと思いますよ!
リンク:WeatherHacks
HttpClientのGETリクエストでJSONデータを取得する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
/** * HttpClientでWeatherHackのJSONデータをGETする */ #include <Arduino.h> #include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h> #include <ESP8266HTTPClient.h> #include <WiFiClient.h> ESP8266WiFiMulti WiFiMulti; void setup() { Serial.begin(115200); // Serial.setDebugOutput(true); Serial.println(); Serial.println(); Serial.println(); for (uint8_t t = 4; t > 0; t--) { Serial.printf("[SETUP] WAIT %d...\n", t); Serial.flush(); delay(1000); } WiFi.mode(WIFI_STA); WiFiMulti.addAP("**********", "**********"); } void loop() { // wait for WiFi connection if ((WiFiMulti.run() == WL_CONNECTED)) { WiFiClient client; HTTPClient http; Serial.print("[HTTP] begin...\n"); if (http.begin(client, "http://weather.livedoor.com/forecast/webservice/json/v1?city=400040")) { // HTTP Serial.print("[HTTP] GET...\n"); // start connection and send HTTP header int httpCode = http.GET(); // httpCode will be negative on error if (httpCode > 0) { // HTTP header has been send and Server response header has been handled Serial.printf("[HTTP] GET... code: %d\n", httpCode); // file found at server if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { String payload = http.getString(); Serial.println(payload); } } else { Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); } http.end(); } else { Serial.printf("[HTTP} Unable to connect\n"); } } delay(10000); } |
このコードを書き込むだけでJSONデータを取得することが出来ます。取得した時のシリアル画面は下記のようになると思います。
この状態ではJSON形式の文字の羅列だけなので分かりませんよね?Arduino自身も、文字列データのJSONにオブジェクトにはアクセスすることが出来ません。なので、JSONをオブジェクト形式のデータに変換して値を取り出してあげる必要があります。この行為をPase(解析)と言います。
本記事ではJSONのパースに関しては触れませんが、ArduinoにはArduinoJSONというJSON形式をPaseしてくれるライブラリが存在します。このArduinoJSONについては後日取り上げたいと思いますのでよろしくおお願いします。
HttpClientについて少し解説
話を戻しまして、今回はWeather Hackという天気予報APIからJSONデータをGETしたわけですが、コード中でどのようにゲットしているか簡単に説明したいと思います。
WiFiMultiライブラリを使用していますが、一般的なESP8266WiFiでも問題ありません。そもそも、自宅内での利用用途なので複数登録する必要ないですね、、、
はじめは、WiFi接続のお作法とclientオブジェクトの作成です。
HttpClientの開始はまずClient.beginでアクセスするURLを指定するところから始まります。次に、GETリクエストをアクセス先のURLに対して送ってあげて、HTTPステータスコードの戻り値を受け取ります。このHTTPステータスコードはエラーの場合はマイナス値を返し、何らかのアクセスが出来た場合はESP8266HTTPClient.hに登録されているコードが返ってきます。
このHTTPステータスコードに対して条件分岐をして、正常な場合とリダイレクトされた場合はボディ部分を読み取ります。そして、Client.end()によりHTTP通信を終了するといった流れになります。
HTTPSの場合にはフィンガーコードの認証が必要になってきますので次回の記事にでもHTTPSにアクセスする方法について書いていこうなと思っております。
コメント