ESP8266 BearSSLでHTTPSサーバー接続


"はとね"さんの記事 "「猫の食生活」を超音波距離センサーでLineに通知してみた" が、困っていた来客の通知に使えそうなので、早速 パクッてみることにした。 はとね さん 勝手に引用してごめんなさい。
課題は、自宅の2階にいるとインターフォンの呼び出し音が聞こえなくて宅配の方に何度も再配達をお願いしなければならない事態が続いていて、これを何とか解決したいと常々思っていたのだけれど、良い解決方法が見当たらなかった。 たまたま距離センサーとESP8266の手持ちもあって、Lineに通知が来るシステム組めれば課題は解決とばかり、早速試作にとりかかった。

準備

ESP8266は3.3V入出力、手持ちの超音波センサーは5V電源で出力も5Vなので、出力を抵抗で分圧、電源はUSB充電器から5VをESP8266開発ボードのマイクロUSB端子に接続、超音波センサーは開発ボードの5V出力に接続。

部品リスト

  1. ESP8266開発ボード
  2. 超音波距離センサー HC-SR04
  3. 10Kオーム抵抗3本(分圧用)
  4. LED 1本
  5. 220オーム抵抗1本
  6. ブレッドボード
  7. ジャンパー線
  8. USB充電器
  9. USBケーブル ####コピペー! 早速、はとね さんの記事からスケッチをコピペ。 SSID, PASSWORDを自宅の環境に合わせて書き換え。 Line NotificationのページからTokenを取得、これも上書き。 準備完了。

テスト

スケッチの書き込みはトラブル無く完了。 リセットしてから、動作テスト。 距離センサーの前に手をかざしてみても、変化なし。 スケッチを眺めてみると、ご確認防止の為に約20秒の待ち時間が設定されている、これを1に書き換えて再書き込み。 今度は郷里センサーが検知してLEDがオンになって、んっ!Lineに通知が来ない!!。 とにかく、動作をトレースするためにシリアルモニターをオンしてみると"Connection Failes"のフィードバック。 LKineのサーバーに接続していない。 色んな記事を調べてみると、同じくコピペしたスケッチで動かないので、ESP32にしたら動いたという記事があったので、ESP32開発ボードに取り換え、スケッチのライブラリー参照の部分もESP32用に変えて書き込み、テストすると”ピロピロピロ”とLineに着信。 これにて一見落着ではあるものの、これしきのものんでESP32は大げさだし、ESP8266はたくさんストックもあるので、何とかEPS8266で動かしてみたいと言う、欲求が抑えきれない。

調査

繋がらない原因はLine NotificationのHTTPSのサーバーにSSL証明なしでつなぎこみに行こうとしている事と分かってきたけど、なんでESP32では同じコードで繋がるのか? キーワードを変えながらググって見るけれども中々これといった参考になる記事が見当たらない。 2日目 BearSSLなる書込みを発見、

修正したコード

BearSSL::WiFiClientSecure client; を一行挿入

qiita.rb
//Line通知
void sendLineNotify() {
  const char* host = "notify-api.line.me";
  const char* token = "Line Token"; *** Line Notificationから取得したTokenに書きかえ
  const char* message = "%f0%9f%8d%9a"; //ごはんの絵文字をURLエンコードしたもの

  BearSSL::WiFiClientSecure client; // *** この一行で解決 ***

  client.setInsecure();
  Serial.println("Try");
  //LineAPIサーバに接続
  if (!client.connect(host, 443)) {
    Serial.println("Connection failed");
    return;
  }
  Serial.println("Connected");

ブレッドボードで試作

参照したURL

[ねこの食生活] https://next.rikunabi.com/journal/20170719_t12_iq/
[BearSSL] https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/bearssl-client-secure-class.html