コンパイル書き込み実行
まず、インターネットに接続されているご自分のWi-Fiルーターを起動して、ESP32 ( ESP-WROOM-32 )が接続できるようにしておいてください。
では、Arduino IDE でコンパイル書き込み実行させてみてください。
シリアルモニターを 115200 bps で起動します。
すると、下図の様に表示されます。
まず、ルーター(アクセスポイント)に接続しなくても、Wi-Fi スキャンは可能で、近辺の SSID と 電波の強さが表示されます。
最後の「*」印は、パスワード認証が必要なアクセスポイントという意味です。
この時点で、ESP32 は soft AP モードで起動していて、Wi-Fi サーバーになっています。
下図の様にスマホの Wi-Fi 設定を開いてみると、Arduino IDE スケッチで定義したように、ESP32 の SSID が表示されていると思います。
これは Android 7.0 のスマホ画面です。
つまり、当たり前ですが、スマホ側にも Wi-Fi Scan でこのように表示されているということですね。
では、たとえば、softAP の SSID を ESP_AP01 に設定した場合、そのアクセスポイントをタップすると、下図の様にパスワード入力画面になりますので、Arduino IDE スケッチで定義したパスワードを入力してください。
「接続」をタップして、しばらくして、ESP32 と接続されると、下図の様にアクセスポイントの最上位に表示されます。
ただ、ESP32 ( ESP-WROOM-32 )自体はインターネットに接続されていないので、それらしきメッセージや通知が出ますが、気にしないでください。
(※気にして下さい! そのメッセージをタップしてください。)
実は、Android 10.0 スマホでは、その時に上部に下図の様なポップアップウィンドウメッセージが出ます。
それを無視せずに、タップすると、以下のような表示になります。
そうしたら、「このネットワークはインターネットに接続していません。接続を維持しますか?」と聞いてくるので、「はい」をタッチすれば良いです。
次に、スマホ側のブラウザの URL 入力欄に、
192.168.4.1
と入力してください。
これは、ESP32 チップ全てにデフォルトで共通の soft AP モード IP アドレスです。
そして、GO すると、下図の様に表示されます。
この画面は Android 7.0 で、ブラウザは Google Chrome です。
シリアルモニターを見ると、下図の様に表示されます。
スマホ側から送信されてくる最初の1行は
GET / HTTP/1.1
となるので、それを検知したら、スマホへ HTML タグを送信して Webページを表示させています。
セレクトボックスには、下図の様に、WiFiScan したアクセスポイントと電波の強さなどが列挙してあり、最も電波が強いアクセスポイントが最上位に表示されます。
次に、インターネットに接続された、目的のルーター(アクセスポイント)に接続します。
下図の様に、セレクトボックスで目的の SSID をタップし、パスワード入力欄にパスワードを入力して、「STA Connection GO!」ボタンを押してください。
すると、しばらく経って、ESP32 がコネクションに成功すると、下図の様に表示されて、緑色でNTPサーバー取得時刻が表示されればOKです。
この時、シリアルモニターでは下図の様に表示されます。
最初の1行で
GET /?ssid_select=xxxxx&pass1=xxxxxxxxxxx
という文字列がスマホから送信されてくるので、それからSSID とパスワードを抽出して、SPIFFSフラッシュへ保存し、再びフラッシュから SSID とパスワードを読み取って、アクセスポイントに接続していることが分かると思います。
ここで注意していただきたいのは、ブラウザから入力されたパスワードはこの様に表示されてしまうので、悪意のある第三者から簡単に盗み取られてしまう可能性があります。
これは SSL 通信ではないので、十分理解した上で個人の責任において使用してください。
SSL通信でない場合のブラウザのパスワード送信は、ホントに丸見えなのです。
合わせて以下の記事をご覧ください。
Arduino – ESP32 で SSLサーバーを構築し、セキュアな Wi-Fi アクセスポイントセレクターを作ってみました
そして、アクセスポイントに接続したら、インターネット上の NTPサーバーに接続して、現在時刻を取得しています。
それをスマホブラウザへテキスト送信して表示させています。
また、「STA Connection Close」ボタンを押すと、ESP32 とアクセスポイントの接続が切断されて、下図の様に表示されます。
その他、パスワードが合わないなど、アクセスポイントと接続できない場合は、20秒でタイムアウトして、下図の様に表示されます。
注意事項
ESP32 ( ESP-WROOM-32 ) の Wi-Fi Server ライブラリは、SSL通信に対応されていません。
そのため、パスワードは暗号化されませんので、十分ご注意ください。
使用はあくまでホビーや趣味程度の使用に留めておいた方が無難です。
client側のライブラリでは、WiFiClientSecure がありますが、server側はまだ無いので、今後の Arduino core for the ESP32 のアップデートに期待したいですね。
まとめ
どうでしょうか?
うまく動きましたでしょうか。
これができれば、外出先のフリー公共 Wi-Fi アクセスポイントにスマホで接続設定できそうです。
ただ、SSL通信でない為、傍受の危険性がありますので、自己責任で使用してください。
これは簡単にできそうかと思ったのですが、意外と面倒で、時間がかかり苦労しました。
今後は Secure な通信にも対応できるように実験していきたいと思いました。
今回はここまでです。
ではまた・・・。
コメント
こんにちは!
僕もこのような試みをESP8266でやったことがあります。htmlを作ったり結構めんどくさいんですよね ^^;
最近はsmartConfigという機能を使っています。かなり楽です。
https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/WiFiSmartConfig/WiFiSmartConfig.ino
ESP-IDFでもサポートされていますので、割と安心して使えると思います。
もしすでにご存知でしたら失礼しました。
けりさん
いつも Twitter ではお世話になっております。
記事をご覧いただき、ありがとうございます。
m(_ _)m
smartConfig は使ったことが無いですね。
これは、公共Wi-Fi などのオープンなアクセスポイントに自動接続するライブラリでしょうか?
あまり詳しく調べてないのですが、このサンプルスケッチだけ見ても、イマイチ使い方がわかりません。。
WiFiSTA ライブラリには、setAutoConnect などの関数があって、使い易そうですね。
これらを使えば、もっと簡略化できるかもしれませんね。
今度挑戦してみたいと思います。
いつも有益な情報、ありがとうございます。
感謝! 感謝!
なるほど!
smartConfig 対応のスマホアプリがあることは知りませんでした。
https://kerikeri.top/posts/2018-02-16-esp32-smartconfig/
これは簡単便利ですね。
このコメントを見た皆さんに有益な情報になると思います。
重ねて情報ありがとうございました。
m(_ _)m
こんにちは!
こちらの記事を参考にさせていただいて,スマートフォンからESPの設定を行えるようにしました.しかし,androidなら動作するのですが,iphoneだとWi-Fiに接続できても,ブラウザにアクセスできません.
そちらはiphoneでも動作していますでしょうか?
ちなみにブラウザはsafari,google chrome等一通り試してみました.
cyprisさん
大変申し訳ございません。
只今、当方の不具合により、過去記事全てのソースコードの’¥’マークと、改行が消えてしまいました。
ブログを全面修正して、現在復旧しました。
ただ、その時のコメント投稿も消えてしまいました。
大変申し訳ございませんでした。
このコードで試していただくよう、よろしくお願いいたします。
m(_ _)m
cyprisさん
こんにちは、教えてほしいのですが、スマホ(Android又はiPhone)から
ESP32の設定変更の書換ができたそうですが、私は、訪問先のWiFiの
ルータのSSIDとPassを書き換えられるようにしたいと思います。
この辺のインターフェースの簡易版を作りたいのですが、注意点など
教えて頂けませんか。
宜しくお願いします。
Tomさん
管理人の mgo-tec です。
当ブログにお越しいただき、ありがとうございます。
この質問は cypris さん宛てということで承りました。
cyprisさん、ご覧でしたらご回答よろしくお願いいたします。
mgo-tec 様
本テキストにチャレンジしています。
設定したアクセスポイントへの接続まではできたのですが、ESP32 の soft IP アドレスへの接続ができません。
Android 7.1.1 を使用、「接続できません」のメッセージとなります。
アドバイスの程お願いいたします。
juchangさん
いつも記事のコードを試していただき、ありがとうございます。
当方で確認したところ、特に問題無く接続できました。
Android 7.0 です。
スマホのWi-Fi画面スイッチか、またはWi-Fi設定画面でsoft APへのアクセスは問題ないということですね。
とすると、ブラウザのURL入力欄のURLはどのように入力されていますか?
192.168.4.1
と入力してアクセスできなかったら、
http://192.168.4.1
と入力してみてください。
因みに、ブラウザはGoogle Chromeを使ってみて下さい。
また、セキュリティーソフトで引っかかっている可能性があります。
その場合は、一時的にセキュリティーソフトや、Wi-Fiセキュリティーソフトを解除してみてください。
mgo-tec 様
いつもご面倒をお掛けします。
Google Chromeを使っていて、http://192.168.4.1 とも入力していますが、いずれも「応答時間が長すぎます。」とのメッセージとなります。
「空の設定ファイルを SPIFFS フラッシュへアップロードする」というところが今一理解できていないのですが本トラブルと関係ありますでしょうか。
smartConfig も閲覧しましたが、やはり関連が理解できません。
ご指導の程よろしくお願い致します。
juchangさん
そうですか。。。
APconfig.txt は、station mode のアクセスポイント一覧を保存するためのファイルです。
soft APのアクセスとは関係ありません。
ならば、ブラウザのURL欄に192.168.4.1 を入力した後のシリアルモニターはどう表示されるか教えてください。
mgo-tec 様
シリアルモニターの表示を確認しましたところ、スマホのアクセスポイント選択で表示されるはずの「 15 – AP_STACONNECTED 」の表示がありませんでした。
パスワードの変更(長めに)、ライブラリーの整理等試してみましたが効果がありませんでした。
juchangさん
なるほど。
Arduino IDE の「ツール」で「Core Debug Level」をverboseにしているということで良いでしょうか?
それは外部Wi-FiルーターにSTA(stationモード)で接続できていないということのようです。
でも残念ながら、情報が少なすぎて、どこが悪いのか全く判断できません。
もっと情報をいただきたいので、それ以前のシリアルモニター表示はどのように表示されていますでしょうか?
scan start
scan done
networks found
などが表示されていますか?
また、スキャンされたアクセスポイントのSSID一覧は表示されていますでしょうか?
mgo-tec 様
「 Core Debug Level 」の設定が違っていました。
verbose に設定し書き込みをしたところ下記のメッセージとなりました。
[D][WiFiGeneric.cpp:336] _eventCallback():Event:15-AP_STACONNECTED
dhcps:send_offer>udp_sendto result 0
[D][WiFiGeneric.cpp:336] _eventCallback():Event:17-AP_STAIPASSIGNED
scan start
[D][WiFiGeneric.cpp:336] _eventCallback():Event:1-SCAN_DONE
scan done
9 networks found
0:Buffalo-*-****
1:**********
接続の瞬間のみ、AP_STACONNECTED となりますが、その後表示しなくなります。
juchangさん
私は今、最新版環境で動作確認しています。
Arduino IDE ver 1.8.9
Arduino core for the ESP32 1.0.2
気になったのが、
という一連のところです。
AP_STACONNECTED
AP_STAIPASSIGNED
というのは、なぜかSTAモードでアクセスポイントに接続したということになります。
最初はSoft AP モードで起動せねばならず、STAモードで起動して、外部ルーターへ接続されてしまっていますね。
これはおかしいですね。
このメッセージの前に
AP_START
というメッセージがなければ、Soft AP モードで起動できていません。
私の場合は以下のように表示されます。
この記事を書いた当初とArduino core の最新版とではメッセージの出方が違いますが、これは、Soft AP モードがスタートしたというメッセージで、これが正しい動作です。
今一度、ソースコードの36行目、37行目が正しく入力されているか確認してみてください。
また、Soft AP モードのSSID とパスワードは半角9文字以上にして、文字以外の記号は入れないで試してみて下さい。
mgo-tec 様
下記の動作環境となっています。
Arduino IDE ver 1.8.9
Arduino core for the ESP32 1.0.2
Arduino IDE ver 1.8.5 でも試してみましたが同じ結果となります。
36行目: WiFi.mode(WIFI_AP_STA);
37行目: WiFi.softAP(ap_ssid, ap_pass);
としていますが正しいですか。
SSID とパスワードも半角9文字以上としています。
ご確認の程お願いいたします。
mgo-tec 様
その後の調査で、書き込み後シリアルモニターを立ち上げた時点では、[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 0 – WIFI_READY
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 13 – AP_START
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 13 – AP_START
と表示されていることを確認しました。
その後の、スマホのアクセスポイントへの接続後に、AP_STACONNECTED
AP_STAIPASSIGNED
となっています。
juchangさん
なるほど。
AP_START が出て、その後、スマホからのWi-Fiアクセスポイント接続で、ESP32 の Soft AP モードとの接続は出来ているようですね。
因みに、シリアルモニターには
Server started
という文字は表示されていますか?
Soft APモード接続は出来ているとすると、あとはブラウザとの通信がうまく行っていません。
Server started という文字が表示された後、ESP32 はサーバーとして動作します。
その文字が表示されているならば、ブラウザのURL入力欄に 192.168.4.1 を入力してエンターを押した後、シリアルモニターに
new client
という文字は表示されますか?
mgo-tec 様
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 0 – WIFI_READY
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 13 – AP_START
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 13 – AP_START
Setup done
Server started
scan start
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 1-SCAN_DONE
scan done
ここまでテキストと同じ表示となっています。
ブラウザのURL入力欄に「 192.168.4.1 」を入力してエンターを押してもシリアルモニターには何の変化もありません。
juchangさん
それは謎ですね。
ということは、ソースコードの67行目を通過できていないということです。
ESP32がclientを認識できないようです。
ソースコードの50行と51行の間に
delay(1);
を入れてみて下さい。
また、Arduino IDE 「ツール」のボード設定は私は以下のようにしています。
Partition Scheme の設定を換えたら、新たにSPIFFSにファイルを書き込む必要がありますので、ご注意ください。
Partition Schemeは基本的に変えなくても良いと思います。
以上で試してダメならば、もしかしたら Android のバージョンが影響しているのかも知れません。
私のAndroidはバージョンが低いために、セキュリティーが甘いのかも知れません。
もしかしたら、Android7.1の場合は動作しないのかもです。
私はスマホを買い替える予算が無くて、今は試せません。
申し訳ありません。
あ!
ちょっと待ってください。
調査中~!
juchangさん
当方のAndroidバージョンは8.0.0の間違いでした。
大変失礼いたしました。
m(_ _)m
それでも一世代前の端末ですが。。。
いずれにしても、Android 7.1.1の端末は持っていないので、if(client)文を通過できないのは原因不明です。
今日中には調査できないと思いますので、今後分かり次第お知らせしたいと思います。
mgo-tec 様
50行と51行の間に
delay(1);
を入れることにより、「 AP_STAIPASSIGNED 」の表示は出なくなりましたが、「 192.168.4.1 」を入力してもシリアルモニターの変化はありませんでした。
Setup done
Server started
scan start
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 1 – SCAN_DONE
scan done
9 networks found
0: *************(-84dBm)*
1: ********** (-85dBm)*
省略
8: *********** (-93dBm)*
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 15 – AP_STACONNECTED
scan start
[D][WiFiGeneric.cpp:336] _eventCallback(): Event: 1 – SCAN_DONE
scan done
*networks found
繰り返し
貴重なお時間を割いてお付き合いいただきありがとうございました。
今後ともよろしくお願い致します。
juchangさん
そうですか。。。
たぶん、私は原因究明できそうもないです。
ソースコードの65行、67行で、
client = server.available();
if(client){
のところを通過できないということは、ESP32のサーバープログラムが動作しないということです。
この記事を書いた当初は Android7.0 で動作確認しているので、Android7.1.1も同様かと思われます。
juchangさんの端末で何か他のWi-Fiセキュリティーソフトが働いませんでしょうか?
ソースコードの転記で誤りが無ければ、私には原因究明できそうもありません。
お手上げです。
申し訳ございません。
m(_ _)m
今後何か分かったらお知らせしたいと思います。
お役に立てず、申し訳ございません。
m(_ _)m
mgo-tec 様
諦めきれずに試行錯誤を繰り返しています。
Webで検索している中で、WiFi接続時の電圧降下が原因ではとのやり取りがあり、独立電源が良いという情報がありました。
具体的なやり方が理解できないため、mgo-tec さんにお伺いを立てたいと思います。
又、「ツール」のボード設定で、Core Debug Level は「なし」と「 Verbose 」のどちらが良いのかご教示の程お願いいたします。
juchangさん
すみません。
当方では症状が出ないため、検証ができないでいます。
ESP32-DevKitC か ESPr Developer 32 または M5Stack をお使いでしたら、私の方で症状が出ないので、どうやって解決したら良いのか分からない状態です。
その他のボードでしたら、もしかしたら電源の可能性もありますね。
電源はUSBハブを使わないことが重要です。
また、PCのUSBポート(できればUSB3.0)に直挿しして、USBケーブルは太く短く、良質のケーブルを使用してください。
格安USBケーブルは要注意です。
また、長い間、ESP32 の大電流によって、PCのUSBポートが破壊されている場合があります。
その場合はモバイルUSB電源等で試してみるというのも手です。
Core Debug Level は「なし」にしていた方が、シリアルモニターへの文字出力が減るために安定動作します。
「Verbose」はどこでプログラムがストップしたかを探るのに有効で、問題無い時は「なし」にする方が良いです。
juchangさん
そういえば、ひとつ心当たりがありました。
ソースコードの36行目の前に
を追記してコンパイル書き込みしてみてください。
これは、WiFi設定を全てリセットする関数です。
昔、私のESP32がWiFiに繋がらなくなった時に、WiFi.begin関数の前にこれを試したら、無事接続できました。
それでもダメなら、Arduino core for the ESP32 の「スケッチの例」にあるサンプルスケッチ
SimpleWiFiServer
の WiFi.begin 関数の1行を以下の2行に書き換えます。
ap_ssid と ap_pass はそれぞれ半角9文字以上にしてください。
それでコンパイル書き込みしてみてください。
それでもうまく行かない場合は、ESP32が故障しているか、USBポートが壊れているという原因になると思います。
以上、ご確認くださいませ。
mgo-tec 様
接続成功!
大変ご面倒をお掛け致しました。
softAP のアクセスポイントをタップしパスワードを入力すると、「接続先にインターネット接続がありません」というところまではテキスト通りだったのですが、その後「このネットワークはインターネットに接続していません。接続を維持しますか?」というメッセージが出ていたのに気付きませんでした。
「はい」をタップし、ブラウザの URL 入力欄に「 192.168.4.1 」と入力すると無事接続できるようになりました。
その後の操作もテキスト通りとなります。
いつも単純なミスでご迷惑をお掛けし申し訳ありません。
これでカメラモジュールに集中して取り組むことができます。
ありがとうございました。
juchangさん
そういうことでしたか。
そういえば、この記事には実際の動画を掲載していなかったので、スマホからどういうメッセージが出るか分からないですね。
この記事の後、セキュアなSSL通信を使ったアクセスポイントセレクターを作った時には動画をアップしていたので、そちらを見ればスマホ側のメッセージ表示が見られました。
Arduino – ESP32 で SSLサーバーを構築し、セキュアな Wi-Fi アクセスポイントセレクターを作ってみました
できるだけ動画をアップした方が良いのかな? と、今回、私自身も学びました。
何にしても、ちゃんと動作してホッとしました。
こちらこそ、いつもいろいろ試していただき、ありがとうございました。
スマホorノートPCでAPを設定したくてこのページに辿りました。
早速、掲載されているソースを実行したところ、 SSIDとPASSはSPIFFSに
保存できたのですが、143行目の内容がスマホに表示されない時があります。
(例えば、同じSSIDとPASSを入力した時等)
おそらく、125行目のWiFi.beginの影響があるかなと思うのですが
どのように対処したらよろしいでしょうか?
ArduinoのVerは1.8.12です。
tamaさん
記事をご覧いただき、ありがとうございます。
この記事も随分前に作成して、すっかり忘れていました。
久々に動かしてみたところ、私の場合は特に問題無く動作しました。
私の環境は以下です。
Arduino core for the ESP32 ver 1.0.4
Arduino IDE 1.8.13
Windows 10
143行目の内容が表示されない時があるということは、緑色のNTP時刻表示のところのことですね。
他は表示されているということは、WiFiアクセスポイントに接続はできていて、WiFiルーターからNTPサーバーへ接続がうまくいっていないと考えられます。
表示されるときと表示されない時があるということならば、NTPサーバーを変えてみるという手もあります。
今現在が、time.windows.com ならば、
ntp.nc.u-tokyo.ac.jp
に変えてみるとか、
time.nist.gov
に変えてみるとかでしょうか。
これで試してみて下さい。
mgo-tec 様
ご回答ありがとうございます。
NTPサーバーを、time.windows.com、ntp.nc.u-tokyo.ac.jp、time.nist.govに
変えてみましたが、表示されない時がありました。
(追記:表示されない時というのは、Firefoxの画面に
「192.168.4.1 のサーバーからの応答が一定時間以内に返ってきませんでした。」
というメッセージが出てしまい、以後ESPからは切断された状態になります。)
なお、シリアルモニタのログを見ると、
[SSID] Connecting …
…….
WiFi connected
Local IP address: 192.168.0.177
———–[SSID] Connected!
time.nist.gov: 132.163.97.3
Transmit NTP Request
Receive NTP Response
HTTP/1.1 200 OK
Content-type:text/html
Connection:close
143行で出力されるhtmlソース
Now Time 2020/10/19/ 10:11
client disonnected
上記のように、ESPからNTPサーバーに接続して時刻は取得できているようなのですが、
時々、その結果を端末側に送信してくれない事があります。
ちなみに、ハードはTTGO T-Cameraというのを使っています。
tamaさん
なるほど、そういうことだったんですね。
ちょっとまだ情報が少なくて判断できませんので、次のことを教えてください。
1.スマホのOS種類(iOSなのかAndroidなのか)とバージョン
2.Arduino core for the ESP32 のバージョン
3.「STA Connection GO!」ボタンは毎回確実に表示されていて、それを押した後に192.168.4.1からの応答が無いことがあるという認識でよろしいでしょうか?
4.この記事は、ブラウザはGoogle Chromeでしか実験しておりません。Google Chromeで試されましたでしょうか?
mgo-tec 様
すみません、こちらのミスが原因で今回の不具合が起きたようです。
というのも、昨日から見てるソースの一部に改変した所があって
これはまずいと思い、もう一度掲載されたソースを
Android端末(Ver10、Chrome)で実行すると、
今度は143行目の内容が毎回正常に表示されるようになりました。
下手にカスタマイズしていたのを見落としていたようです。
お手数おかけしてすみませんでした。
tamaさん
そうだったんですか。
原因が分かって良かったですね。
実は、この質問を検証していて、久々にsoftAPモードを動かしていて、全然つながらなくてハマりました。
Androidスマホの画面にポップアップメッセージが出ているのを無視していたことが原因だったのです。
ここのコメント投稿で、以前、juchangさんが悩んでいたことを私がすっかり忘れていたんです。
これはハマる人もいるだろうなと思ったので、トラブルシューティング記事に追記しました。
このキッカケがなかったらスルーしていたので、逆に質問頂いて気付けて良かったです。
ありがとうございました。
m(_ _)m