為了方便控制攝影棚內的照明,把很多燈光的配線集中管理,希望達到的效果是透過 WEB 介面直接點擊某個鍵,由 ESP8266 取得參數後設定 TB62706 (位移暫存器),再透過光耦合器去控制 RELAY MODULE 上的開關來控制燈光亮滅。
錯誤選擇
一開始是用 Wifiduino (Wemos D1)來架,但是 Arduino 本身的時脈太低、記憶體不足,所以只能架 HTTP server,架不了支援 SSL 的 HTTPS server。因此,改換成 ESP8266 d1-mini 來架。
因為設定的硬體架構除了 ESP8266 的 Wifi 和透過 SPI 去控制的位移暫存器外,還需要支援 SD Card 來運件,所以在 ESP8266 D1-mini 的腳位上來說,是有一些吃緊,但還好依然夠用。
不過一開始對這些硬體該用那些函示庫不是很熟,原本的 Arduino IDE 介面對這部份的管理較弱,所以先是改用了 Visual Studio Code 來安裝 PlatformIO 來設計,它的好處是對於整個專案用到了那些函示庫,要作那些設定都有很清楚的規劃和對應的檔案架構,這對於專案管理的幫助很大。在此大力推薦!
開發瓶項
整個開發過程基本上就是按部就班,先拿 ESP8266WebServer 的範例確認 Wifi 的運作正常和 HTTP Request 的處理正常,之後才改成 ESP8266WebServerSecure,但這部份有遇到瓶頸,因為認證檔有兩種格式,一種是 PEM,一種是 DER,各有不同的範例,寫法也略有不同。
認證部份因為 DER 要直接編譯在晶片上,比較不方便,所以最後選擇 PEM 格式,然後把 CERT 和 KEY 都存在 SD 卡裡面,在啟用時讀入資料,然後建立 RSA 驗證機制。這樣作的好處是隨時要換認證的話,只要改 SD 卡的檔案即可。
這裡有個伏筆是為了用免費的合法認證所準備,也就是像 Letsencrypt 這樣的免費認證服務。
不過這部份的取得有點小技巧,也就是手上要有域名主導權,先用電腦架一個空的主機,再向 Letsencrypt 申請憑證,取得憑證後把它存入 SD 卡,這樣就可以了。
最後整合
在完成 HTTPS server 的架構之後,接下來就是把位移暫存器的運作程式加進去,這部份因為一樣是用 SPI 的 protocol 在運作,程式不複雜,但腳位又很有限,所以選擇獨立設計 SPI 的運作,不確定是否可以共用函示庫,甚至腳位。這部份以後再研究。
用了三個腳位來負責 LE, SCK, SDI,然後串了兩顆 TB62706來控制 32 埠的 RELAY MODULE。運作的方式很簡單,就是用一個 unsigned long 變數來記錄每個埠的亮滅狀態,再從每次取得的 bit 序號來決定亮滅的埠,算出變動後的數值,再透過 SPI 寫到位移暫存器上,整個就可以運作了。
下一步 - MQTT
不過整個架起來之後發現實用性有限,為了資訊安全的考量加入了 SSL 認證,卻造成每個請求都要花5秒左右才能完成,整個實用性大大下降。
當然,如果降低憑證的長度可以提高速度,但這又會讓憑證變成是不安全的狀態,實在兩難。所以下一步只好讓 ESP8266 只負責內部網路的部份,改走 MQTT 協定,加速運作。之後,再用 Raspberry PI 來架 MQTT Server 和 HTTPS Server,讓硬體端的運作不受限於速度,讓安全性和認證的問題由 Raspberry PI 來把關,分層負責。
小插曲 - CORS
因為在 ESP8266 上架了一個 HTTPS Server,但是如果讓它像一般的 Web Server 一樣負責所有的內容輸出的話,整個效率也會很低。所以基本上是由另一個 Web server 來控制它,例如用 www.inventor.com.tw/lab 的介面去呼叫 lab.inventor.com.tw 上的功能,這時就產生了 CORS 的問題,也就是跨網存取的現象。
這部份一方面點出了跨網存取的授權設定之外,另一方面也造成每一個動作都會產生兩次請求,一次 OPTIONS,一次 GET 或 POST,這會造成 HTTP request 的處理程序重覆運作,尤其是在開關切換的動作上,作二次剛好等於沒作。
這部份就要特別把 OPTIONS requests 濾掉,只回覆跨網存取授權,之後再處理正常的 GET/POST 來決定系統的運作,這樣才會正常。但是也因為每個動作都呼叫兩次,造成實際運作的速度更慢了。所以非改成 MQTT 和透過 Raspberry PI 來主控不可,不然真是慢到爆啊~~
結語
不論是否真的具備實用性,但經此一役至少證明了用 ESP8266 是能架出合法憑證的網站的,也能夠正常運作。同時也深刻了解到運作的瓶頸和限制,知道應該用怎樣的架構運作才最有實用性。希望一點心得能與同好們共享~~~有興趣的可以下載原始檔玩玩。
|