跳至主要内容

DPIP 為什麼這麼難用?

· 閱讀時間約 11 分鐘
YuYu1015
Full-Stack Engineer (全端工程師)

前言​

TREM 與 DPIP 最早是從 2022 年 5 月中開始開發的。當時我完全沒有寫程式的基礎,一切都是邊做邊學,服務範圍也從單純的地震,逐漸拓展到其他不同類型。 隨著時間推移,服務範圍越來越廣、系統也越來越複雜,維護因此變得困難,穩定性也逐漸下滑。

這篇文章放了半年,總算要開始說故事了。要釐清 DPIP 為什麼這麼難用,得先從 TREM 的整個發展過程說起。

為什麼選擇做地震?​

故事要從 2022 年 3 月 23 日的花蓮地震 說起。當時人在臺南的我,先感受到搖晃,警報才姍姍來遲,這讓我開始思考:我可不可以自己動手測地震,看出哪裡正在發生地震? 有了這個想法後,恰好學測剛結束,多出不少可運用的時間,於是同年 5 月,這個計畫就這樣展開了。

TREM-net 觀測網​

TREM-net 觀測網總共由三種感測器組成:

網路名稱感測器類型上線時間備註
SE-net (Strong Earthquake)MEMS 加速度儀2022-05-31強震觀測網
MS-net (Micro Seismographic)力平衡式速度儀2023-04-09微地震觀測網
ES-net (Enhanced Sensitivity)MEMS 加速度儀2025-11-02增強靈敏度地震觀測網
提示

SE-net / MS-net 預計於 2026 Q4 淘汰,後續將由 ES-net 接替。

第一台地震儀​

編號 6732340 地震儀

這台地震儀是用 MPU6050 + ESP32 做的,編號 6732340,放置於我自己的家中,從 2022 年 5 月運作至今(2026 年 8 月),目前仍正常運作。

SE-net 地震儀

上圖為安裝於一般住家中的 SE-net 地震儀 ver 1.0。ver 1.0 採用 AC 110V 供電,機內降壓至 DC 5V;隨後推出的 ver 2.0 則改為外部 DC 5V(一般手機充電器)輸入。到了 ver 2.1,則採用透明 Arduino UNO 外殼設計,藉此簡化加工流程、降低生產難度並縮小體積。ver 2.2 則首次嘗試 3D 列印外殼——雖然創新,但受限於當時尚未擁有自有 3D 印表機,僅生產極少量,最終停產並繼續以 ver 2.1 為主力生產規格。

從 2022 年 5 月到 2026 年 8 月,SE-net 一直是 DPIP 即時資訊與強震監視器通知的主要資料來源,但隨著時間推移,也逐漸浮現出一些問題。 於是在 2025 年 9 月,在 bclswl0827 avatarttyAMA0

的幫助下,開始著手開發新一代 ES-net,目標是更穩定、更靈敏。

新舊地震儀比較​

以 2026/08/25 臺灣東南部海域 M5.8 地震為例,比較兩套地震儀在同一場地震中的實際表現:

SE-net​

臺東縣臺東市 7725352

SE-net 地震儀
提示

因架構設計問題,SE-net 在遇到強震時容易丟失資料。

三軸分量

項目EWNSUD
加速度 (cm/s²)36.1219.1910.51
速度 (cm/s)1.621.161.55

綜合指標

項目數值
3 分量合成加速度 (PGA, gal)39.07
3 分量合成速度 (PGV, kine)1.65
最大計測震度3.9
最大震度階4 級
速度反應譜 (SVA)3.43
長周期地震動階級 (LPGM)0 (3.43 cm/s)
開始時間2026/08/25 15:00:06
結束時間2026/08/25 15:01:22

ES-net​

ES-net 地震儀

分析​

除了穩定性不佳之外,從雜訊表現也能看出兩者的差距:SE-net 雜訊高達 400 µg/√Hz,ES-net 則只有 60 µg/√Hz。

而且不穩定的狀況並不只發生在強震當下——SE-net 平時就很容易斷線,工作人員得頻繁聯絡用戶,請對方重新插拔地震儀,大幅增加了維運的工作量。

高雜訊加上不穩定(並伴隨大量雜訊誤報),正是我們下定決心開發新版地震儀的主要原因。

講故事​

硬體是一段辛酸史,軟體架構同樣沒少踩雷。時間拉回最初,看看整個系統是怎麼一路演進(也一路壞掉)到現在的。

第 1 卷​

早期(2022 年 5 月,大約是高三學測後)剛開始做 SE-net 時,完全沒有程式基礎,主要以 PM2 + JavaScript 進行開發。 站在如今的視角看,當時選擇 JavaScript 也為後續埋下了一系列的炸彈,但 JavaScript 在當時是我唯一能駕馭、足以拿來撰寫大型專案的語言。

要知道當時可沒有 AI 啊!!!身邊也沒有朋友或家人從事這方面的工作,更別說有人可以請教(別指望普通高中的老師,高職或許有機會?)。

備註

從 CMD 換成 PM2 時相當震驚,原來還有這麼好用的東西(笑)。

製作的過程中認識了蛋捲PVP,學到非常多知識(主要是地球科學相關)。在蛋捲的推動下,開始於全台各地部署 SE-net 地震儀。

備註

當時並不知道這樣能不能測到地震——那可是 MPU6050 啊!!!一顆才 60 元台幣,說出來我自己都不信,我跟蛋捲都是在賭。

同年,在一位熱心人士的引薦下,認識了 CWB 地震測報中心的科長陳達毅。讓我學到了非常多(海量)EEW 系統相關的知識,並於 12 月正式與交通部中央氣象局(CWB)簽約合作。

備註

當時的名稱還是交通部中央氣象局(CWB),現已改為交通部中央氣象署(CWA)。

簽約半年後,於東華大學部署了第一台 MS-net 力平衡式地震儀。 這東西做得很粗糙:ADS1115 + Geophone(4.5 Hz)+ ESP32,沒了,卻運作到現在,我覺得已經是奇蹟了。 如果需要高精度力平衡式地震儀,可以參考 AnyShake 的產品。

備註

SE-net 是範圍主力,負責收集全台觀測資料;MS-net 則是速度主力,能測到非常小的 P 波,進而提升預警速度。

2021 年的電腦

我當時的主力電腦(ASUS X55V),CPU Pentium 2020M、Ram 4GB DDR3,就是撿家人汰換下來的電腦,開個 VSCode 都卡到炸——天崩開局。SE-net 就是在這樣的環境下誕生的(沒錯,它現在還活著——而且,再說一次,當時真的沒有 AI 可以問!!!)。

2021 年的伺服器

當時的主力伺服器(AMD Ryzen 5 5600X),現……現在還在服役……(笑),只是已經從主力戰將被貶去打雜了(負責各類非即時資料整理)。

第 2 卷​

PM2 一路用到 2024 年初,後來經歷一次大重構:PM2 → Docker、Node.js → Bun.js(JavaScript)。重構完成後,有了「看似」不錯的表現?

好景不常,僅僅過了幾個月,JavaScript 沒有型別約束所導致的問題開始浮現,隨著新功能不斷疊加,開始頻繁出錯,頭都大了,於是開始引入 TypeScript 試圖緩解這類問題。

備註

TREM-Lite 就是這個時期的產物,知道為什麼這麼難用了吧——它連 IDE 都不會提示型別,得自己背下每個變數的型別跟用意。

提示

2024 年 4 月,發生了 0403 地震(M7.1),面對突然暴增的流量,完全束手無策,設備、經驗兩頭空。

第 2.5 卷?​

2024 年 0403 地震後,意外認識了更多人,也迎來了強力外援。首先是巨科資訊有限公司,贊助了我的個人電腦(換掉那台 ASUS X55V)跟伺服器(AMD Ryzen 9 7900X)。緊接著是台灣數位串流有限公司,提供了超高頻寬的伺服器(用來應付地震時的突發流量)。地震觀測本來就是個冷門領域,這兩家公司願意伸出援手,真的非常感激。

備註

AMD Ryzen 9 7900X 到目前(截止 2026 年 8 月)都還是主力,而且看樣子還會撐很長一段時間——現在硬體貴成這樣,怕是要傾家蕩產才換得起(笑)。只是它最近開始出現不少毛病(像是硬碟頻繁掉盤等),讓我很頭痛。

第 3 卷​

整個 2025 上半年都是在修修補補中度過,沒什麼實質性的進展。

真正的改變在同年 9 月,在 bclswl0827 avatarttyAMA0

的推薦下,開始嘗試使用 Golang,並逐步分批將舊服務全部用 Golang 重寫(是 rewrite,不是 native port!)。

效果非常顯著:終於能高效地用上多核(相較於 JavaScript),記憶體用量更低,CPU 用量在等價計算下也更低,打包出來的 Image 更小等等。

除了用 Golang 重寫外,也大砍了架構設計(以前過於複雜且冗餘,很常不穩定),把 Balance Server 上 Nginx 後方的 Server 砍掉,改成 Openresty + Lua 實做,同時用 Lua 實做更細緻的快取控制(如果去 YouTube 上翻地震紀錄影片,可以發現現在延遲超級低,這就是改用 Lua JIT 實做帶來的差異)。

還有諸如把 JSON 儲存換成 SQLite 這類調整(嚴肅!不要笑!這是歷史遺留問題)。

Server 資料庫也從 MariaDB 改成 ClickHouse(存波形)+ HA PostgreSQL(存解算資料),內部通訊則由 WebSocket 換成 NATS(不需維護健康狀態,簡化邏輯並提高穩定度,同時天然具備異地備援能力)。

備註

以前 JSON 時代,API 響應速度會有明顯延遲。

提示

2026 Q4 預計將從 HTTP Polling 改成 SSE。

新舊 TREM EEW 系統差異​

新系統

地震儀裝置監控面板

提示

舊版的異地多活雖然兩個節點都會發報,但解算結果通常差異很大。實際使用時,也只能固定使用單一節點(且故障時得手動切換)。

提示

新系統兩邊一樣都會解算,但最後會透過仲裁來決定哪個節點有發布權限(自動故障轉移)。 同時也會自動補齊兩邊差異測站,避免特定測站只存在單邊的情況(例如一邊連不上)。

TREM 檢知報告

狀態監測​

新系統

狀態監測

ML 模型​

YuYu1015-PhaseNet-50Hz-268k-v1

YuYu1015-IntensityGMM-TW-45k-v1

結論​

番外篇​

學生時代​

高一高二高三,我的成績應該都是倒數的(不是班排,是校排),但我其實有認真在讀書(大概吧?)。 高中念了 4 年,大一還回去高中重補修,全校大概也就我了。 反正當時應該就是被當成怪人(不上課都在胡搞瞎搞) + 廢人(成績爛),一開始家人還會很生氣,但後來就放棄了。 而且當時家人很討厭我用 3C 產品,希望我能好好讀書,手機還曾被折成兩半(喜提折疊機)。 經過好幾次家庭革命,才勉強能做自己想做的事。 說到底,也只能說是運氣好,一路上遇到很多願意幫助我的人。

備註

有很長一段時間,都是用手機在寫程式的,記程式碼在哪個檔案的哪個位置(因為手機螢幕很小,用背的比用找的快)。

2024/04/03 地震​

主震時的 TREM EEW 內部紀錄:ExpTech 2024/04/03 07:58 M7.1 地震紀錄。

餘震剛好都發生在語音通話時,你是什麼人 2024/04/27 M5.8 地震紀錄,事後看真的快被笑死。