本文敘述了基於Espressif ESP8266 的動態密碼之門禁系統方案中詳細的製作過程,供各位參考,若有任何改進的建議,筆者將不吝指教,先行致謝。
發想
筆者現在於某公司實習,我親身體會到傳統密碼想保有高安全性,卻設下了種種複雜的規則與限制。所以,筆者在此自行製作了簡易的登入方式。
方案大意
筆者在登入各大網站時,也與各位相同,要自己想帳戶名與密碼,因此,我想製作既不用花時間取個吉利的名字;也不用耗精力擠出可怕的密碼,可以輕鬆驗證身分的登入系統。
應用場景
筆者在設計此方案時,是在公司內部運作,則帳戶使用工號最為適宜,可以透過公司分發的員工證感應,以取得工號。密碼則是使用TOTP技術,由系統生成具有時效性的密碼。
材料
- 核心控制裝置 :為了開發方便,選用Arduino Mega 2560
- 文字顯示螢幕 :LCD
- 使用者輸入 :薄膜鍵盤
- 員工證感應裝置 :NFC
- TOTP QRcode螢幕 :OLED…真不好受,詳見後記
- 時間記憶裝置 :RTC,TOTP協議所需
- 網路傳輸裝置 :ESP8266,雖然多一片MCU…多一份成本,但開發真方便!
硬體架構簡述
為了方便,LCD、NFC、RTC、OLED裝置都是走I²C協議,所以只要電源、接地、串列時脈、串列資料線,萬分感謝I²C在杜邦線交雜的環境下,訊號傳遞正確性非常不賴(因為I²C正常用在焊接好的電路板上)。
至於薄膜鍵盤,普通的接至GPIO。ESP8266則是走UART協議。
初期硬體架構
我先製作好了外殼,雖然是個箱子,但有上方面板就足矣,零件都嵌在面板上。為了有點造型感&人性化,將面板傾斜約30度。
不過當時Arduino Mega與ESP8266,當時是固定於外殼底部,當面板要掀開時,零件與控制器之間的杜邦線須被迫拆除。
後期硬體架構
最後,實在是忍受不了,每次維修皆須重配電路,我將控制器移至面板背面,還腦洞大開的將他們焊接至萬用板上,可真是苦了筆者的焊接技術。
並且,我還將兩個控制器溝通的UART線路,改由銅線焊上,而非杜邦線,畢竟UART一開始在哪,就不會變了。因為焊接的永久連接性,我感到了樸實無華的穩定線路安全感…。
軟體架構簡述
既然是要做登入系統,那就要先想出步驟來:
- 顯示初始歡迎介面
- 按確認鍵,以使用系統
- 選擇登入或註冊
註冊分支:
- 請求感應員工證(或其他NFC裝置)
- 顯示QR code,引導使用者下載TOTP程式
- 顯示QR code,引導使用者存入TOTP金鑰
- 請求TOTP密碼,驗證存入成功
- 記憶NFC UID與TOTP金鑰
- 上傳註冊紀錄至後台,返回初始歡迎介面
登入分支:
- 請求感應員工證(或其他NFC裝置)
- 請求TOTP密碼,驗證身分
- 顯示登入結果
- 上傳登入紀錄至後台,返回初始歡迎介面
好像有地方怪怪的!
我知道…我知道,登入之後啥都沒有,還自動回到歡迎介面,但是Hey!本方案的重點是門禁,而不是門禁的背後有什麼。畢竟我做不出像Amazon IAM那種大型的管理系統(但我會努力的)。
軟體架構
因筆者學習過FPGA,想將上述步驟,直接照搬有限狀態機(Finite State Machine)的概念來做,建置的同時,也方便增加串列訊息輸出,驗證每個function是否正確運作。
基於TOTP金鑰要編碼為Base32,我上維基百科學了好一陣子,才將此編碼轉化為程式碼。
雖然單獨分開後,每個function都很簡單,但結合起來後,就是會有些毛病在,修修改改後終於是可以運作了,以下為詳細的流程圖:
至於上傳到後台,我使用Google Script與Google Sheet做串接,ESP8266收集此次登入/註冊資訊後,傳送至Google Script API,透過Google Script整理好資料後,儲存於Google Sheet。
後記
嗯…真的有QR code跑出來了,連筆者自己都因這些精密電子毫無錯誤的訊號傳遞結果感到讚嘆,不過,此QR code裝置在弱光/強光環境下,會過曝/亮度不足,有時需要靠運氣才掃得到。
我額外製作了線路匯流排,以利佈線&防止插錯,焊接時,為了偵錯而立了大功。
實際上,需要用到的I/O很少,我也知道MCU的ROM也是越小越好,可以進一步壓低成本,不過,我的程式碼真的是太肥了!
最後,感謝觀看此博文,歡迎任何問題&建議。
評論