禁書圖書館:將智慧燈泡變成數位暗箱
概觀
禁書圖書館是一個「賽博朋克數位暗箱」,它將 Wi‑Fi 智慧燈泡改造成離線網頁伺服器,提供被禁或受挑戰的書籍的數位副本。透過將裝置改為開放的 Wi‑Fi 存取點,任何在附近的人都能在不需要網際網路連線的情況下,存取精選的電子書庫,同時外觀上仍像一般家用電器。
硬體選擇與拆解
ESP32C3 平台
本專案使用內建 ESP32C3(4 MB 快閃記憶體) 的智慧燈泡。作者最初嘗試 Tasmota——一套用於本地控制智慧裝置的開源韌體——但最終決定自行編寫韌體,以減少膨脹並最大化書籍儲存空間。
實體改造
為了取得內部電路,作者對燈泡進行了拆解,步驟包括:
- 使用剃刀刀片移除塑膠燈泡外殼。
- 撬開 LED 子板以露出主板。
- 挖出包覆主板的橡膠狀灌封膠。
- 將線焊接到 VCC、GND、TX 與 RX 腳位,以便透過 FTDI 裝置進行序列編程。
克服儲存限制
4 MB 快閃記憶體的限制
只有 4 MB 的總快閃記憶體,裝置必須同時存放韌體、網頁伺服器檔案與電子書。原本的 Tasmota 分割表將近 3 MB 分配給主應用程式 (app0),而僅有 320 KB 給儲存分割區 (spiffs),遠不足以容納圖書館的內容。
自訂分割表
為了擴增儲存空間,作者修改了 ESP32 的分割表,縮小應用程式分割區並將 SPIFFS 分割區擴展至 2 MB。因為 ESP32 框架為安全起見會阻止寫入分割表等敏感區域,作者從 Arduino IDE 轉而使用 ESP-IDF(Espressif IoT Development Framework)。在 menuconfig 中啟用 SPI_FLASH_DANGEROUS_WRITE_ALLOWED 後,作者得以在位移 0x8000 處覆寫分割表。
韌體架構與功能
混合開發環境
為了保有 Arduino 函式庫的便利,同時利用 ESP-IDF 的底層控制,作者在 IDF 中實作了「Arduino as a Component」。這使得可以使用 AsyncWebServer、ElegantOTA 等函式庫,同時仍能修改系統層級的快閃設定。
捕獲入口實作
為了讓使用者在連上開放 Wi‑Fi 後能自動找到圖書館,裝置實作了 捕獲入口(captive portal),透過兩個主要機制:
- DNS 重新導向:DNS 伺服器對所有請求回傳裝置本身的 IP 位址。
- HTTP 攔截:伺服器捕捉 Android、iOS、Windows 裝置的特定「呼叫回家」請求(例如
/generate_204或/hotspot-detect.html),並將其重新導向至圖書館的索引頁面。
安全開機與 OTA 更新
為了在不影響安全性的前提下支援 OTA(Over‑the‑Air)更新,作者打造了自訂的 安全開機(safeboot)韌體。此韌體避免在非揮發性儲存(NVS)分割區中以明文儲存 Wi‑Fi 憑證,因為這會成為公共空間裝置的安全風險。安全開機分割區允許管理者透過極簡的網頁伺服器刷寫新韌體映像檔。
網頁應用與管理介面
使用者體驗
圖書館採用手寫的網頁介面,呈現「故障」美學,內容包括:
- 精選書目列表,顯示書名、作者以及被挑戰或禁用的原因。
- 參考資料區(雖然在連接離線燈泡時外部連結無法存取)。
管理控制
受密碼保護的 /admin 面板允許操作員調整 LED 色溫。透過在控制 LED 的 GPIO 腳位上使用 AnalogWrite(),操作員可以讓燈光與周遭環境相匹配,以降低被發現的機率。
社群見解與技術批評
技術社群的討論指出了多項實務與概念層面的考量:
- 連線障礙:部分使用者指出,現代 Android 裝置常會自動斷開未提供網際網路的 Wi‑Fi 網路,可能妨礙自然的發現流程。
- 偵測風險:雖然燈泡在外觀上能融入環境,但批評者認為透過 Wi‑Fi 掃描或僅僅切斷電源就能輕易偵測到此裝置。
- 概念前例:此專案被拿來與「PirateBox」(約 2012 年的離線檔案分享中心)以及使用 LoRa 進行網狀通訊的「Meshtastic」專案比較。
- 「禁書」的定義:有評論者爭論說,從學校圖書館移除的書籍在法律上並非「禁書」(因仍可購買),而另一些則認為任何對公共存取的限制皆屬於審查形式。
未來路線圖
- 進階色彩控制:在管理介面加入 RGB 滑桿,以提升環境偽裝效果。
- 網狀網路:實作使用分散式雜湊表(DHT)的網狀網路,使城市中多顆燈泡能共享同一本庫,使用者無論連到哪顆燈泡都能取得完整書目。
摘要: 一位開發者利用 ESP32C3 改造 Wi‑Fi 智慧燈泡,打造「禁書圖書館」——一個隱蔽的離線網頁伺服器,透過開放的 Wi‑Fi 存取點提供數位書籍。
標題: 禁書圖書館:將智慧燈泡變成數位暗箱