ESP8266 : マイコンなのにHello, world!

LチカをしたESP-WROOM-02だが, やっぱりESP8266の威力を体験するためにはWi-Fi関連を使わねばならない. そこで, (マイコンでは珍しく)Hello, world!をする.

Web Server

Web ServerでHello, world!する. またArduino IDEでお茶を濁する.

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

#define WIFI_SSID "your_ssid"
#define WIFI_PWD  "your_password"

ESP8266WebServer server(80);

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

  // WiFi接続
  WiFi.begin(WIFI_SSID, WIFI_PWD);
  while(WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println("Wi-Fi connected.");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  // Hello, wprld!送信
  server.on("/", [](){
    server.send(200, "text/html", "<h1>hello, world!</h1>");
  });

  server.begin();
}

void loop() {
  server.handleClient();
}

WiFi.localIP()でIPアドレスを取得できるので, そこに接続すると以下のように表示される.

Hello, world!

ESP8266WebServer関係は色々書き方があるみたい. ここで使っているラムダ式は ここを参考にした. FS.hを使って外部ファイル・画像を表示させることもできるらしい(参考).

POST

将来的にWeb APIを叩くことを見据え, POSTでもHello, world!してみる. POSTの説明はWikipediaに任せようと思ったのに, 意外なことに日本語版が無かった.

[https://en.wikipedia.org/wiki/POST_(HTTP)]

私は現代っ子なので, 今回はLINE Notifyを叩いてみる. またもやArduino IDE.

#include <ESP8266WiFi.h>
#include <WiFiClientSecureAxTLS.h>

#define WIFI_SSID "your_ssid"
#define WIFI_PWD  "your_password"

const char* line_api = "notify-api.line.me";
const char* line_token = "your_token";

void line_send(String message) {
  axTLS::WiFiClientSecure client;
  
  // APIに接続
  if (!client.connect(line_api, 443)) {
    Serial.println("Connection failed.");
    return;
  }
  Serial.println("Connection opend.");

  String query = "message=" + message;
  client.println("POST /api/notify HTTP/1.1");
  client.println("Host: " + String(line_api));
  client.println("Authorization: Bearer " + String(line_token));
  client.println("Content-Length: " + String(query.length()));
  client.println("Content-Type: application/x-www-form-urlencoded");
  client.println();
  client.println(query);
  client.stop();

  while (client.connected()) {
    String line = client.readStringUntil('\n');
    Serial.println(line);
  }

  Serial.println("Message sent.");
}

void setup() {
  // WiFi接続
  WiFi.begin(WIFI_SSID, WIFI_PWD);
  while(WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println("Wi-Fi connected.");
  Serial.print("IP Address: ");
  Serial.println(WiFi.localIP());

  // Hello, world!送信
  line_send("Hello, world!");
}

void loop() {
  delay(10000);
}

LINE Notifyのトークン取得や叩き方については, ここを参考にした.

同じようにLINE Notifyを叩いている例があった(参考)が, これはどうも動かなかった. 2017年の記事だから, 仕組みが変わったのか? 色々調べていて, このサイトを参考に WiFiClientSecureAxTLS.hを指定してみると動いた. 一応断わっておくが, 私もタイ語は読めない. AxTLSは組み込み用のSSLライブラリらしいが, 具体的にそれがなんなのか, どうしてライブラリに付属していたのかはわからない. SSL関係の仕組みについて勉強する必要がありそう.

ちなみに, リセットボタンを連打するとこうなる.

LINE Notifyは送信専用なので, ユーザからのメッセージに対してイベントをしたいなら Messageing APIになる. ただ, ESP8266でどれだけできるかは知らない.