IoT何をいまさら(104) ESP-EYE、ESP-IDFでSimple HTTPD

Joseph Halfmoon

ESP-IDFのExampleをほとんどコピペしながら、ESP-EYEを一歩一歩動かしてみております。前回はWiFiアクセスポイントに接続成功。今回はシンプルなhttpdを動作させて、パソコンからアクセスしてみます。インクリメンタルに継ぎ足してきている実験用のソースファイルが膨れ上がってきました。そろそろ対処を考えないと。

ESP32マイコンにカメラとMEMSマイクを装備したESP-EYE(マイク搭載版)をシミジミと使えるようになるべく、Espressif社のESP-IDF環境を学んでおります。慣れない環境でおっかなびっくり。でもドキュメントとExampleコードが充実しているので、それらを真似っこ(コピペとも言う)すれば、動かすことはそれほど難儀ではありませぬ(本当か?)千里の道も一歩よりと申します、本日もその一歩を進めると(コピペだけれども。)

参照するマニュアルとExample

タイトルでは文字数を短くするために HTTPD(HTTPデーモン)と綴りましたが、見るべきマニュアルの表記は HTTP Serverです。

ESP-IDF Programming Guide >> HTTP Server

そして参考にできるExamplesも充実しています。結構な種類あります。今回は、その中でも一番シンプルなんだろうと想像できる(そのものズバリのsimpleという名のフォルダに入っている)サンプル・コードを参照させていただきます。ファイル実体はESP-IDFの以下の場所に入っている筈です。

ESP-IDFのインストールパス\esp-idf\examples\protocols\http_server\simple\main\main.c

このExampleの動作は簡単で、接続ができた後、

http://IPアドレス/hello

に接続するとありがちな “Hello World.” メッセージを返してきます。また、

http://IPアドレス/echo

にあててPOSTすると、POSTしたデータをオウム返しに返してくるというものです。簡単だけれど HTTPサーバーではある、と。

前回プログラムの改造

前回作成(肝心なところはコピペだけれども)したプログラムに、上記の参照ファイルからまたもやコピペで必要な部分を取ってきて HTTP Server化してしまいます。

前回プログラムでは、Kconfig.projbuild に設定したアクセス・ポイントに接続するところまで作ってあります。今回はその後に継ぎ足す形で HTTP Server を起動すれば良い筈。

1.不足する includeファイルを取り込む

Server関係のヘッダファイルが不足しているので、Exampleみながら追加しますが、以下は不要でした。

#include "protocol_examples_common.h"

ExampleでもAPに接続しようとしているのですが、こちらはこちらで既に接続するところまでデキているので上記不要と思います。

2. TAGは一つでよい

TAGという変数はLOG出力時に使われる文字列ですが、これまた独自に定義しているので、Exampleの中身をそのままコピペすると被さります。

3. hello_get_handler()から、connect_handler()まで取り込む

サーバ立てるために必要な関数群はそのままコピペ。ただし app_mainも取り込むと重なってしまうので、それは不要と。

4. 前回の wifi_init_sta() に代わる関数の定義

とりあえず wifi_init_sta()に代わり wifi_init_httpd()という名に関数を定義してみました。実作業は以下の2点です。

  • サーバー用のハンドラの変数を定義しておく、
  • 前回のwifi_init_sta()はAPとの接続を果たした後、イベントループを停止してしまうので、末尾の3行の代わりに HTTP Serverを呼び出す

ハンドラ変数の定義は以下です。

static httpd_handle_t server = NULL;

HTTP Serverの呼び出しは以下です。

server = start_webserver();
動作確認

前回までで大分なれた、ESP-IDFのビルド手順に従ってビルドしていけばオブジェクトができあがり、そしてESP-EYEへのアップロードもOKっと。すべて

idf.py

という1個のツールでできるのが便利です。裏じゃninjaからcmakeからいろいろ走っているのに。

さて、ESP-EYEにオブジェクトをアップロード後、仮想シリアルソフトで接続(当方、伝統のTeraterm使用であります)すると例によって大量のログが出力されてきます。その末尾がこんな感じ。

START_LOG今回、TAGを START としており、STARTからメッセージが出力されているのが分かります。そしてHTTPのデフォルトであるポート80でServerが動いているみたいです。

まずは、IPアドレス/hello にブラウザ(いつもはChromeですが、別にしたかったのでOpera使ってみました)で接続してみたところを冒頭のアイキャッチ画像に掲げげました。ちゃんとサーバーしているようです。

続いて、POSTデータのオオム返しをテストするために、短いPythonプログラムを書いてPOSTしてみました(ESP-IDFのExampleフォルダ内にもテスト用の立派なPythonプログラムが用意されていますが、立派過ぎてConfigからデータを引いてきて動かすものように思われたので、今回は遠慮させていただきました。)こんな感じ。

ECHOHTTPでステータス 200 というのは OK だよね。そしてお馬鹿なプログラムの中でPOSTしているデータはaho=bakaです。戻ってきているみたい。

実際、ESP-EYEのLOG側を観察すると、ちゃんとボードにも届いているようでした。こんな感じ。

ECHO_LOG
HTTP Server、動いてますな。当たり前か。コピペだし。

しかし、ファイルが大分長くなりました。そろそろ整理したいですが、また、ESP-IDPの設定方法を学ばないとダメみたい。その件は、また次回か。

IoT何をいまさら(103) ESP-EYE、ESP-IDFでWiFi AP接続 へ戻る