去年開始玩 ESP 開發板,ESP8266/ESP32 內建無線網路( ESP32 還支援藍牙),可以在上面跑網站當成控制介面,比 Arduino 能玩出更多有趣應用。平日寫 Web 寫 C# 健步如飛的我,來到以 C/C++ 為主的 Arduino 世界重讀幼幼班,身處學步階段本應簡單寫寫能跑就好,不能奢談架構、模組化、可擴充性、可重用性... 等進階議題,偏偏我卻深陷老鳥魔咒,明明是為了好玩寫點小程式,卻滿滿內心戲陷入無止境天人交戰,搞到心很累。

其中一點我最無法接受 - 幾乎所有範例程式都把 WiFi 基地台的 SSID 跟密碼寫死在程式裡。密碼用明碼寫進程式超不安全,二則每次改密碼需改程式重 Build,雖然在家寫著玩衍生安全風險有限,密碼修改機率也不高,但這涉及信仰是原則問題,我怎麼都無法接受自己的程式寫死密碼,Over My Dead Body!

於是,我花了十幾個小時終於搞出一個自己可接受的 WiFi 設定程式庫,連不上網路時自動切換到 AP 模式,連上 ESP 模擬的基地台,透過網頁介面(預設 IP 192.168.4.1)設定無線基地台名稱及密碼,連線成功會回報 IP,重新啟動連上無線網路後可開始正常作業:

之前的文章以 Gist 方式分享程式庫,要用需下載 Guineapig.WiFiConfig.h、Guineapig.WiFiConfig.cpp 存入專案,不怎麼方便。於是我將它轉成 Arduino 程式庫放上 Github,如果是用 VSCode + PlatformIO 開發,只需修改 platformio.ini 加入 lib_deps = https://github.com/darkthread/Guineapig.ESPLib 即可在程式裡使用它。(註:Guineapig.ESPLib 同時支援 ESP8266 及 ESP32)

為方便大家驗測,我也寫了範例專案放在 Github,如果你有裝 VSCode + PlatformIO,git clone https://github.com/darkthread/EspWifiConfDemo.git 或從 Github 下載 ZIP 解壓縮後,用 VSCode 開啟 EspWifiConfDemo 資料夾,即可編譯、上傳,馬上測試。

範例程式可測試設定 WiFi 密碼,連上無線網路後提供一個沒什麼大用的網頁介面,按燈泡圖示控制 ESP 開發板內建 LED 開跟關,大家可以玩看看。

展示影片

後話,在 ESP32 社團被問到為什麼不用現成 WiFi Manager 程式庫要自己寫?在上回分享 WiFi 設定程式庫時有提到我的心路歷程,這裡再整理一下。

在決定自己動手寫之前,我試用過五種程式庫,其中不乏介面華麗功能還很強大的,像是支援mDNS(不需註冊 DNS 伺服器,透過網路廣播方式找到 xxx.local 主機)、Captive Portal(連上 ESP 執行的 AP,不管輸入什麼網址都會導到 ESP 上的網站伺服器)、掃瞄並列出範圍內的無線基地台... 等等,但對我來說功能太多也太複雜。我只想要一個輕巧、簡單、安全,可中文化的版本,夠用就好,所以我犯了全天下程式開發人員都會犯的錯,我造了自己想要的輪子。

而這個版本符合我常在追求的極簡風格,使用時只要多加一個 if,如此而已:

  //嘗試連上無線網路,若成功傳回 true 繼續作業;若失敗則啟用 AP 模式讓使用者連上來設定網路
  if (WiFiConfig.connectWiFi())
  {
    //... 成功連上無線網路後才能進行的動作
  }

找不到市面上有用起來這麼精簡的 WiFi 設定程式庫,那就自己寫一個吧! 而造輪子是強迫你學習進階技巧的好方法,我在整個過程中學會 C++ 物件導向的寫法(雖然沒經驗寫得很鳥)、知道怎麼將包成 Arduino 程式庫放上 Github 供自己跟別人快速引用,這些如果沒有嘗試自己動手做過,可能一輩子都學不會。有這樣的經驗跟想法,難怪我一天到晚在造輪子,呵。

Share my first ESP IoT board library and example project.


Comments

# by Kai

您好,嘗試想要將重設網路的webserver 放進.cpp當中,如同.cpp中initConfigWeb()的做法一樣,但無法成功,網頁顯示連不上該網站,但將程式碼放在.ino,就可以成功,想問這個問題可能的原因為何呢? 感謝指教

# by Jeffrey

to Kai, 你是用 Arduino IDE 開發嗎?我接觸 ESP 程式後就都改用 VSCode + PlatformIO (大推!! 上手後就不會想再用 Arduino IDE 寫程式了),用 PlatformIO 的話可以下載範例專案成功執行,再修改你需要的功能。我沒研究過 Arduino IDE 使用 cpp,不確定有什麼眉角,建議你趁這次問題換成好用的 PlatformIO (再推一次坑),我比較能幫得上忙。

# by Kai

to Jeffrey, 後來發現還要有while判斷迴圈,讓他不能跳出function如同initConfigWeb()的做法一樣,不然webserver 就會失效,現在已經可以如我所願運作。 好的,我再來研究看看PlatformIO,感謝你。

# by Marco

好用...感謝!

Post a comment