先週紹介したSlackからデジタルサイネージにメッセージを表示する。では、Slackで指定したメッセージをデジタルサイネージに表示させるため、サーバーを実装するところまで説明しました。本記事では、デジタルサイネージ側からサーバーにあるメッセージを取得します。具体的には、ESP8266でのHTTP GETリクエスト処理について解説します。

当例ではESP8266のプログラミングはArduino IDEを用いて行いますが、環境構築については公式ドキュメントか日本語の紹介記事をご覧ください。

ライブラリのインクルードとWiFi情報の用意

ESP8266でHTTPリクエストを行うにはいくつかの方法がありますが、今回はESP8266HTTPClientを使った方法を紹介します。はじめに必要なライブラリをインクルードして、WiFiに接続するためのSSIDとパスワードを用意します。


1
2
3
4
5
#include
#include

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

WiFi接続/切断・JSONレスポンスの表示

setup関数を記述します。サーバーからメッセージを一度だけ取得するのでほとんどの処理がこの関数に書かれています。処理ごとに確認していきましょう。

Arduino IDEのシリアルモニタから出力を確認するためにシリアル接続を設定します。シリアルモニタはIDEの右上にある虫眼鏡のようなアイコンをクリックして表示されるウィンドウです。

シリアルモニタを開いたら、右下にあるボーレートを9600bpsから115200bpsに変更しておきましょう。

1
while(!Serial){}

はシリアルの接続が確立するまで次の処理を待ちます。


1
2
3
4
5
void setup() {
  Serial.begin(115200);
  while(!Serial) {}

...

続けてWiFi接続を行います。

1
WiFi.mode()

はESP8266のWiFi機能を親機や子機、または両方として設定できます。下記のコードでは子機となります。


1
2
3
4
5
6
7
8
9
10
...

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
  delay(100);
}
Serial.println("Connected!");

...

setup関数最後の処理は、HTTPリクエスト後に受け取ったJSONメッセージの表示とWiFiの切断です。

1
fetchMessage

関数は次のセクションで定義します。


1
2
3
4
5
6
7
8
...

  String message = fetchMessage("");
  Serial.println(message);

  WiFi.disconnect();
  Serial.println("Disconnected!");
}

ESP8266でのGETリクエスト

fetchMessage関数を定義し、GETリクエストの処理を記述します。接続先のURLを引数として受け取り,

1
http.GET()

で実際にGETリクエストを行います。その後

1
httpCode

の値によって条件分岐をかけていますが0以上の場合は200, 404のようなHTTPステータスコードが含まれています。マイナスの値はリクエストがなにかしらの理由で失敗した場合に使われます。例えば

1
-4

はネットワークの接続が切れていることを示します。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
String fetchMessage(char host[]) {
  HTTPClient http;

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

  String payload = "";

  if (httpCode > 0) {
    Serial.printf("HTTP GET ... code: %d\n", httpCode);
    if (httpCode == HTTP_CODE_OK) {
      payload = http.getString();
    }
  } else {
    Serial.printf("HTTP GET failed, error: %s\n", http.errorToString(httpCode).c_str());
  }

  http.end();
  return payload;
}

今回は何も処理を記述しませんが、存在しない場合はエラーとなるので

1
loop()

関数を末尾に追加します。


1
void loop() {}

動作確認

必要なコーディングは以上です。それではスケッチをESP8266に書き込み、シリアルモニタから設定したメッセージが表示されることを確認しましょう。下図のような出力が得られれば成功です。(コードの全体像はこちら)

これで前回用意したサーバーからメッセージを取得することに成功しました。

次回は最終回として、受け取ったJSONレスポンスをパースし、デジタルサイネージに表示させる方法について解説します。XSHELLに関する最新情報は@xshell_incで確認できますので、ぜひフォローしてください!

コメント