[HTTPS server based on ESP8266]
鬼打牆好幾天,終於把這個問題給解了,為了避免忘記就先留一下筆記,這當中有很多因為不熟悉而走的冤枉路,同好間若有相似的問題可以參考。
※硬體
一開始是使用 Arduino UNO + Ethernet shield, 這個可以架 http server, 但受限於記憶體和運算速度, 要跑 https 應該是很難。所以之後就換玩手上的 Wifiduino, wemos D1.
但 wemos 不是沒有缺點,最大的問題就是它的 IO 腳位太少,所以能控制的週邊就相對有限,這部份只能再往其他規格的版本作挑選。
※IDE
原先都是習慣用 Arduino IDE 在開發,但其實它的一些功能算是非常簡化的,剛好在 Github 找範例後,發現有人是用 PlatformIO 在開發,所以就花了一點時間去試 Visual Code Studio, 再將 PlatformIO 掛上去,然後把相關的 library, board 都弄上去。一開始是不太習慣,但 PlatformIO 是值得推薦的,主要原因是它可以讓設計者很清楚自己是用那些 library 在作那些事,整個設定都很清楚。
※ Certificates
這部份也是跑了不少冤枉路,因為對認證的東西從來都不熟。所以一般 example 裡的認證要怎麼用,其實都是用亂試的概念在弄。這部份主要是有兩種格式,DER 跟 PEM。
DER 是16進位碼,適合直接編進晶片裡;PEM是文字檔,為了方便管理,選擇把它存在 SD 卡裡,然後啟動時讀出來用。
另外,認證的產生方式當然可以自己用 OpenSSL 去產生,但是這個方式的認證在對外使用時會顯示不安全的狀態。所以這部份改用 Letsencrypt 的免費認證。
作法就是拿自己的某個域名,架一個空的 web server,然後用 certbot 替這個 web server 申請一組認證,再把這組認證的 PEM 檔存到 SD 卡上,之後這個 web server 的 IP 改成用 ESP8266 架的這個 https server,這樣就可以用受認可的認證來運作了。
缺點就是每三個月要更新一次認證,這也是為什麼會選擇用 PEM 格式存在 SD 裡面的原因了。
※ 盡信書不如無書,just try it
在網路上拿範例來改,真的是問題一大堆。但現在這好像是開發程式的常態,只能從別人的範例中去拼裝出自己要的東西。有時在想,用這麼多東西,但好像連函示庫裡究竟有多少東西都沒有仔細看過。也常遇到一些範例的功能其實根本不能用或有錯。這種都要自己改才行。像是這個 https server 的 NTP 功能就沒有正常運作。
總之,可以往下一步繼續前進了,可以把控制外部硬體的東西加上去了。
不過,未來的理想架構應該會是由 Raspberry PI 來當作中控主機,而 esp8266 這些只用 MQTT 的方式溝通傳值和控制硬體,人機介面的部份再用 web interface 連到 PI 上面去作控管。畢竟要跑 SSL 和較多吃效能的功能的話,ESP8266 的效能還是有限。
這部份等這些週邊元件都搞定後,再來作整合了。
感謝一路上提供建議資訊的同好們~~~謝謝!
雅竹題
2018-12-17 10:03:08
ESP8266上面的WEB我都是做無線基礎設定,無線連不上多久就自動轉熱點,再定時掃ssid,原本的ssid在就連到ssid之類的,當正常的web server效能真的有限
Charlie Ting
2018-12-17 10:41:35
我還沒優化到提升穩定性的部份, 不過真的是要留意一下變動後的 recovery 時間, 不然如果網路斷個線, 或AP當一下, 整個東西都要重新來過, 也是很麻煩.
雅竹題
2018-12-17 10:52:19
最後我只讓ESP8266乖乖的發MQTT至SERVER,SERVER的確也是用PI
Charlie Ting
2018-12-18 00:37:20
又多一個問題,就是 CORS,造成傳值被擋或重覆提交的狀況。
這點主要在於跨域整合,所以兩端會以 CORS 進行一次 OPTIONS 提交。所以程式上要針對不同的請求作過濾,以免重覆動作。
不過最大的問題還是效能,每次提交都要好幾秒才能完成,即時性太差了。安全性和方便性看來必須用其他方式處理了。先改用 MQTT。