前回、ESP-EYEをESP-IDF環境でプログラムできるように勉強しようとて、まずはWiFiアクセスポイント(AP)をスキャンしてみました。当然今回はAPに接続となります。接続そのものはサンプルコードをコピペすれば簡単、ではあるのです。が、前回に引き続き Config 関係を調べつつ動かしてみたいと思います。
※「IoT何をいまさら」投稿順Indexはこちら
ESP32に関しては、資料が充実しているので、ネットワーク関係であれば以下の文書を読み込んでいったら良いのだ、と思います。
ESP-IDF Programming Guide >> API Reference >> Networking
でもま、大量の文書を読んでいくのが辛い、特に最近は英語を読むのが辛いです。幸い、ESP-IDFはExampleコードもまた充実、ちらちらとそれらを見ながら(Exampleのソースコードはパブリック・ドメインみたいです)「真似して」いけば動かすのはさほど難しくはありません。何時ものヤッツケな方法。
今回参照したExampleコード
前回は、WiFiスキャンのExampleをベースに、ESP-EYE用にConfigを変更してプロジェクトとしました。今回は、そこで作ったソースに、以下のExampleコードから必要な関数をコピペして、APへの接続を行おうというインクリメンタルな(泥縄とも言う)アプローチ?です。。
esp-idfのインストールフォルダ\examples\wifi\getting_started\station内の station_example_main.c
ぶちゃけ以下の2つの関数とそれらが参照している定義をコピペすればAPへの接続は達成されます。
event_handler() wifi_init_sta()
WiFiです。まず、接続にあたって気になるのは、SSIDとかPasswordとか、どこに書いたら良いの?という件。ソースの中には、以下のような記述があるのです。
#define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID #define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD #define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY
「CONFIG_なんちゃら」のところを直接文字列で書き換えてしまっても良いとは思うのですが、これらが、どこでどうして定義されているのか、ちょっと気になります。
CONFIG_なんちゃらの出元
前回調べてみた menuconfig を走らせると生成されるファイル skconfig の中を見てみました。かなり分量は多いのですが、その中に以下のような部分があります。
# # Example Configuration # CONFIG_EXAMPLE_SCAN_LIST_SIZE=10 CONFIG_ESP_WIFI_SSID="Your SSID" CONFIG_ESP_WIFI_PASSWORD="Your PASSWORD" CONFIG_ESP_MAXIMUM_RETRY=5 # end of Example Configuration
Your SSIDとか、Your PASSWORDとある部分には、実は当方のAPの情報が埋め込まれています。この定義もとは何処よ、と調べるとありました。
ソースコードを置いてあるフォルダの中の以下のファイルです。
Kconfig.projbuild
サンプルプロジェクトを参考に、今回のケース向けに私が書き入れた記述は以下です(勿論、Yourナンチャラ部分は自分の定義。)
menu "Example Configuration" config EXAMPLE_SCAN_LIST_SIZE int "Max size of scan list" range 0 20 default 10 help The size of array that will be used to retrieve the list of access points. config ESP_WIFI_SSID string "WiFi SSID" default "Your SSID" help SSID (network name) for the example to connect to. config ESP_WIFI_PASSWORD string "WiFi Password" default "Your PASSWORD" help WiFi password (WPA or WPA2) for the example to use. config ESP_MAXIMUM_RETRY int "Maximum retry" default 5 help Set the Maximum retry to avoid station reconnecting to the AP unlimited when the AP is really inexistent. endmenu
ソースのビルドと実行確認
前回のWiFiスキャンの後で、AP接続するのが良いかなと思ったのですが、wifiスキャンのための wifi_scan()関数と、AP接続のための wifi_init_sta()関数は、そのままでは両立しないことが分かりました。これはどちらの関数も自分でイベントループを作成し、wifi stationに成ろうとするからです。コピペした関数内部をちょっと改造してやれば解決する問題ですが、今回はテストなので可能な限り関数内部はいじらずデス。#defineで見苦しく切り替えてテストしました。
APに接続しているときのLOG出力が以下に
APに接続は出来ているみたいね。次回は実際に誰かと通信かしら。