數位電路模擬器

 上個月一個學生問了我CPU裡面是什麼東西,雖然我口頭上簡單說了一些,但是總覺得還想多一些細節描述。回來之後,就想應該可以找數位電路的模擬器來做個web介面來解釋看看吧。

以前我修資訊二專的課程時,在學計算機組織的課程時,就自己找了Digital Logic Sim這個軟體自己玩了一陣子,最後其實是可以搭出CPU的喔,但就所有要自己純手工搭建。

而既然我想要弄個web介面來展示的話,就想讓AI來幫忙建一下。先說結論,最後是有搭出來,但CPU模式還是沒完整成功,但至少前幾個步驟都還是不錯的。

https://chihhsiangchien.github.io/CPU-sim/

我覺得前面幾個step用來解釋內部元件是蠻不錯的。









科展海報設計線上工具

指導科展的倒數工作之一,就是要指導學生製作海報。許多年以前,自己還是國中生的時候,是用一張大白報紙上面先用鉛筆畫格子,然後用麥克筆一個字一個字填到格子裡。

後來出現「非常好色」這樣的軟體後,改成設計海報後再切分成多張A4紙來組合出海報。

如今的作法則是用向量軟體在電腦上設計海報,再將海報檔案交給廠商做大圖印製。當我跟學生說要製作海報時,告訴學生可以用哪些軟體製作,例如powerpoint,不過今年學生倒是直接想用canva來製作,我覺得也好,可以共用也有許多範本可以參考,應該還不錯吧。

但等到他們交出初版海報時,倒是嚇我一跳,居然一點都沒參考範本,幾乎就是報告文字白紙黑字直接複製貼上,且圖片還用低解析度,甚至尺寸還比書面報告小。想想也不能太苛責,畢竟海報設計若要憑空想像版面配置和色彩配置,也實在困難。所以後來又花了一段時間教他們修改與微調,總算是能夠見人了。

交件後,我突然想到,如果來做一個科展海報的範本系統,應該很不錯。其實做海報若不考慮多人協作,我認為inkscape是好選擇,內部其實就是用svg繪圖,而svg又是AI可以直接協作的語言。

總之,我就弄了一個海報範本的系統

https://chihhsiangchien.github.io/sciPosterArchitect/web_builder.html



可以選擇多種色彩系統





每個區塊的外框設計



每個小標題的裝飾和幾何形狀


你也可以修改範本裡的文字來看看效果,最後可以輸出svg檔,用inkscape編輯。就算不用它來編輯,也可以用來做版面配置規劃與色彩選擇。



重回駭入小蟻攝影機

最近想起家裡有一台將近十年的小蟻攝影機,突然覺得可以嘗試讓 AI 協助我,重新駭入這台老設備,認識一下嵌入式系統。

工廠測試後門:記憶卡裡的祕密

當年這台攝影機在社群裡引起轟動,主因是有人發現了一個「後門」:只要在 SD 記憶卡根目錄建立一個名為 test 的資料夾,並在其中放置 equip_test.sh 腳本,系統開機時就會自動執行它。當時的我並不清楚腳本背後的邏輯,但最近透過 AI 的協助解析,終於釐清了它的運作機制。這其實是小蟻韌體在開機時的一個「工廠測試後門」。只要系統偵測到特定名稱的腳本,就會以 Root 權限 執行它,這給了我們完全掌控設備的機會。

腳本核心功能解析

  • 植入永久服務 (Telnet & FTP):在 /etc/init.d/ 建立了 S88telnetS89ftp 檔案,確保設備重啟後依然能透過遠端登入。
  • 替換核心服務 (HTTP & RTSP):將官方受限的版本替換為加強版,例如覆蓋 /home/rtspsvr 以支援標準 RTSP 串流,並建立軟連結(symlink)讓網頁服務能直接讀取錄影檔案。

突破防線:獲取 Root 權限

雖然腳本開啟了 Telnet,但我早已忘記預設密碼。然而我發現 FTP 服務雖然無法讀取系統核心,卻具備寫入權限。於是我就讓AI協助,然後採取了以下策略:

  1. 在本地端製作一個「無密碼 root」的 new_passwd 檔案。
  2. 透過 FTP 強行覆蓋機器內的 /etc/passwd
  3. 成功透過 Telnet 免密碼登入系統。

硬體規格探秘

進入系統後,首先確認了這台機器的「心臟」。原來它是採用鼎鼎有名的 HiSilicon Hi3518 晶片,是一個「自帶後門」的晶片。

# cat /proc/cpuinfo
Processor       : ARM926EJ-S rev 5 (v5l)
BogoMIPS        : 218.72
Features        : swp half thumb fastmult edsp java 
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant     : 0x0
CPU part        : 0x926
CPU revision    : 5

Hardware        : hi3518
Revision        : 0000
Serial          : 0000000000000000

系統與記憶體資訊

這是一個典型的嵌入式 Linux 系統,核心版本相當老舊,且記憶體配置極小(僅約 35MB),在現今標準看來非常精簡。

# uname -a
Linux (none) 3.0.8 #1 Wed Apr 30 16:56:49 CST 2014 armv5tejl GNU/Linux

# free   
             total         used         free       shared      buffers
  Mem:        35212        33772         1440            0           56
 Swap:            0            0            0
Total:        35212        33772         1440

當初我的數個定點攝影計畫,許多都仰賴這台攝影機呢,當初的錄製影片儲存路徑,掛載在 /tmp/hd1/record/

資安問題

即便對小蟻相機進行了基礎的 Hack,系統內建的雲端服務依然會嘗試與外部伺服器通訊。

Step 1: 網路狀態初步掃描

首先使用 netstat -atunp 查看目前的連線狀態。可以看到 p2pserver 開啟了 UDP ,這個應該就是用手機連線可以直接穿透內網看到攝影機的關鍵

# netstat -atunp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
udp        0      0 0.0.0.0:46742           0.0.0.0:* 4363/p2pserver

Step 2: 殺不死的 p2pserver?

當我嘗試 kill -9 4363 (p2pserver) 後,再次檢查網路狀態,發現它竟然以新的 PID (21241) 重新啟動,並且瘋狂嘗試外連!連線的遠端伺服器顯示是 p2pserver 正向百度 (220.181.x.x) 與 AWS (46.137.x.x) 發送 SYN_SENT 請求。

# netstat -atunp
tcp        0      1 192.168.1.104:57766     220.181.111.147:80      SYN_SENT    21241/p2pserver
tcp        0      1 192.168.1.104:35924     46.137.188.54:80        SYN_SENT    21241/p2pserver
tcp        0      1 192.168.1.104:32999     61.188.37.216:8000      SYN_SENT    21241/p2pserver

Step 3: 斬草除根 —— 關閉 watch_process

這代表系統中有監控腳本在維持雲端服務的運作。透過 ps | grep watch,找到了元兇:/home/watch_process

# ps | grep watch
 1096 root       840 S     /home/watch_process
# kill -9 1096

先殺掉監控進程 watch_process,再殺掉 p2pserver,它就不會再自動重啟了。

Step 4: 最終狀態確認

淨化完成: 目前系統僅剩下本地端服務 (FTP, HTTP, Telnet),所有外連嘗試皆已停止。
# netstat -atunp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:21              0.0.0.0:* LISTEN      1248/tcpsvd
tcp        0      0 :::80                   :::* LISTEN      1145/server
tcp        0      0 :::23                   :::* LISTEN      667/telnetd
tcp        0     93 ::ffff:192.168.1.104:23 ::ffff:192.168.1.114:39804 ESTABLISHED 667/telnetd

透過這樣操作,才可以將小蟻相機轉為一台「純區域網路」運作的監控設備,確保影像資料不會在未經許可的情況下傳向公有雲端。如果真的要處理資安問題,應該還是自己弄出的樹莓派機器來操作比較好。

ADS-B 物理學:利用飛機 DAPs 數據重建大氣剖面與飛行分析

在上一篇《ADS-B 數位觀察:分析桃園空域航線、高度與信號傳播特性》中,處理了基本的航跡數據。本篇將進入大氣物理分析。用 R 語言對 DAPs 數據的處理,將每架飛機轉化為高空探空儀,重建出即時的大氣剖面。

數據清洗:確保物理分析的準確性

在進行物理計算前,必須篩選出可靠的樣本。在 dashboard.R 中,確保分析的是處於穩定巡航狀態的噴射機,排除低速或起降階段的干擾:

# 篩選高速、高空且具備完整參數的樣本
df <- df %>%
  filter(!is.na(tas), !is.na(mach), !is.na(alt)) %>%
  filter(tas > 100, mach > 0.3, alt > 5000)

熱力學推導:從馬赫數找回氣溫

高空感測最困難的是獲取準確的「靜溫」(Static Air Temperature),利用真空速 (TAS)馬赫數 (Mach) 的比值來推算音速,進而求得溫度。根據單位換算,節 (knots) 與絕對溫度的關係常數約為 38.945

# 物理計算:音速與溫度
df <- df %>%
  mutate(
    speed_of_sound = tas / mach,
    temp = (speed_of_sound / 38.945)^2 - 273.15
  )
垂直氣溫剖面圖,展示從 DAPs 數據推導出的氣溫隨高度變化趨勢

音速與高度的變化觀測

音速並非恆定,而是溫度的函數。隨著高度增加,氣溫下降,音速也隨之變慢。這在航空物理中至關重要,因為它直接影響了飛機的飛行性能包絡線。

音速與高度關係圖,反映出高空低溫環境對聲速的抑制作用

對流層頂 (Tropopause) 的自動偵測

腳本中還包含了一套簡單的邏輯來預測對流層頂。如果在觀測最高度溫度仍持續下降,代表對流層頂位於更高空:

analyze_tropopause <- function(df) {
  top_alt <- max(df$alt, na.rm = TRUE)
  min_temp <- min(df$temp, na.rm = TRUE)
  return(sprintf("對流層頂預測: 目前觀測最高 %.0f ft 溫度仍下降至 %.1f°C", top_alt, min_temp))
}

風場分析與西風指標 (Westerly Index)

利用飛機的地速 (GS) 與真空速 (TAS) 的差異,我們可以計算航向上的風分量。這對於觀察噴射氣流 (Jet Stream) 的強度非常有幫助。

# 計算高空西風帶強度指標
wind_diff <- avg_wind_east - avg_wind_west # 往東順風與往西逆風的差值
Observed Wind Profile (DAPs),左圖為風速隨高度變化,右圖為風向分佈

D-Value 分析:氣壓偏差的實測

這是腳本中另一個進階分析。飛機回傳的高度有兩種:氣壓高度 (alt)GPS 幾何高度 (alt_geom)。兩者的差值稱為 D-Value

# 計算 D-Value:反映大氣壓與標準大氣的偏差
df <- df %>% mutate(d_value = alt_geom - alt)

這能告訴我們當前空域的氣壓是否偏離標準大氣。正值代表當地氣壓高於標準(高壓區),負值則代表低壓區。

高階建模:空氣密度與能量高度

利用標準大氣模型推導出空氣密度總比能 (Specific Energy Height)

# 計算總比能 (特定能量高度)
df <- df %>%
  mutate(
    v_ms = tas * 0.514444,
    specific_energy = h_m + (v_ms^2) / (2 * g)
  )

0.514444 為節轉公尺/秒之常數,確保能量高度計算之單位一致性。這個指標代表了飛機的「總能量」,是評估飛行效率與性能包絡線的重要指標。

信號與流量分析 (Traffic & Signal)

除了物理參數,我們也對接收站本身的性能進行了建模。例如 RSSI (信號強度)高度 的關係:

從數據中可以清楚觀察到,高度越高,接收到的 RSSI 數值通常越穩定。這背後隱含了兩個關鍵物理機制:

  • 自由空間路徑損耗 (FSPL) 與平方反比定律:無線電能量隨距離平方遞減。雖然高空飛機距離接收站較遠,但因其處於高角度,避開了地表的建築物與地形遮擋。
  • 視距傳播 (Line-of-Sight) 與第一菲涅耳區 (First Fresnel Zone):高空飛機擁有更開闊的傳播路徑,能有效減少「多路徑干擾」(Multi-path interference),避免了地面反射波與直接波互相干涉產生的信號衰落 (Fading)。這也就是為什麼 30,000 英尺以上的信號往往比地平面附近的信號更「純淨」。

航向流量統計 (Heading Rose)

利用圓盤圖展示主要流量的方向性:飛過台灣的航線多是東北西南走向的

性能差異:不同機種的飛行特徵

依照飛機重量類別 (Wake Turbulence Category) 進行分類,觀察 Heavy (如 A350/B777) 與 Small 機種在速度與巡航高度上的差異。

如果你對這些有興趣的話,你可以在這個github repo中找到相關的scripts。

掃地機器人裡的 Ubuntu:用 Valetudo 實現完全去雲端化的 Linux 自走車

多年前買了小米掃地機器人之後,我一直很好奇它到底在背景偷偷把什麼東西傳回伺服器。為了揭開這個黑盒子,我曾嘗試將電腦偽裝成 SSID 的 Gateway,透過 ARP 欺騙 (ARP spoofing) 的方式攔截封包。雖然成功拿到了數據,但除了目的地之外,封包內容依然處於加密狀態,難以直接解密。

更令人不安的是,這台機器人傳輸封包的頻率極高,它可是一直傳、一直傳,這種「不受控」的感覺實在令人不爽。直到後來,我偶然發現了 Valetudo 方案,這才解決了我的隱私焦慮。

技術核心:在機器人大腦裡植入「寄生蟲」

簡單來說,Valetudo 就像是在掃地機器人的系統裡放了一個寄生蟲。它會攔截原本要送往遠端伺服器的資料,將其導流至機器人內部的本地空間處理,隨後便銷毀與雲端的聯繫。這讓你的掃地機器人徹底脫離雲端監控,變成一台純粹的區網設備。

安裝流程與環境準備

安裝過程其實不算複雜,但對網路環境的要求較高。以下是我的實作筆記:

1. 回復原廠設定

首先,需要將機器人重置:先按下 Home 鍵,接著拿迴紋針戳一下 Reset 鍵後放開。過一陣子,機器人會發出語音提示正在回復原廠設定,大約需要五分鐘的時間。

2. 下載必要程式

  • 燒錄工具:valetudo-helper-miioota 下載對應作業系統的執行檔。
  • 自定義韌體 (寄生蟲):DustBuilder 找到支援的型號並構建版本。

以我的小米掃地機器人一代為例,我使用了 這個專屬連結。在構建過程中,需要填入個人資訊與 SSH 公鑰(Key),這樣後續才能直接透過終端機遠端登入。

3. 系統環境的坑

在燒錄工具的選擇上,我一開始在 Windows 環境下屢試不爽,推測是防火牆或網路設定干擾。後來改用 Linux (AMD64) 筆電,關閉防火牆與 Tailscale 等網路服務後,一次就成功了。

執行燒錄指令

待機器人重置完成並連上它的臨時 Wi-Fi 後,執行以下指令開始植入:

./valetudo-helper-miioota-linux-x64 install-firmware v11_004018.pkg

不到 10 分鐘,Valetudo 就植入完成了!現在我不僅能使用網頁介面操作,還能直接透過 SSH 登入機器人的後台。

開箱掃地機器人的「內臟」

登入後,我驚訝地發現這台機器的規格相當高規格:

  • 作業系統: Ubuntu 14.04.3 LTS (Trusty Tahr)
  • 處理器: Allwinner A33 低功耗四核 ARM Cortex-A7

這本質上就是一台 Linux 自走車!這也解釋了為什麼它能記錄這麼多隱私資訊。在未「去雲端化」前,它會上傳以下三類資料:

  1. 空間隱私: 透過 LDS 雷達掃描出的 2D 點雲圖,包含家具擺設、移動路徑與房間精確尺寸。
  2. 設備與網路資訊: 定期回報周邊 Wi-Fi SSID 和 MAC 位址,透過「Wi-Fi 指紋定位」即可精確掌握住家經緯度。
  3. 使用者行為: 清掃規律與偏好模式,這足以推斷家中何時無人。

去雲端化前後對比

當你刷入 Valetudo 後,你實際上是在機器內部建立了一道「數位邊界」。以下是處理前後的差異:

資料類型 官方韌體 (上傳北京) Valetudo (Root 後)
地圖數據 上傳伺服器再回傳手機 留在內存,由網頁直接讀取
Wi-Fi 掃描 定期回報周邊環境 攔截,資料僅存於本地日誌
OTA 更新 廠商強制或提示更新 徹底關閉,掌握主控權
通訊加密 伺服器持有 Key 你持有 Token,區網內連線

/mnt/data/rockrobo/rrlog 看到的資料夾,原本是這些敏感資料上傳前的「暫存區」,現在它們哪裡也去不了了。

進階探索:AI Agent 與移動控制實驗

掌握了這台 Linux 自走車後,我開啟了一個 AI Agent,讓它透過 SSH 在機器人內部到處巡檢,並撰寫 Script 驗證各種溝通方式。這部分的技術細節我也整理在我的專案中:

Roborock V1 Research - GitHub Project

這個專案不僅揭露了軟硬體結構,還包含如何透過 Python、API 與 MQTT 與它溝通。我最近做了一個有趣的實驗:

  • 指令發送: 利用 HTTP API 命令機器人移動到指定地點。
  • 狀態回饋: 利用 MQTT 即時回報機器人的當前座標。

結合這兩個特性,我已經能寫 Script 讓它走出特定的路徑,像是三角形、甚至正八邊形。相比起自己找材料組裝的自走車,這台機器人的感測器與底盤配備根本超棒。

結語:CP 值極高的開發平台

目前二手市場的小米掃地機器人一代大約只要 1000 元台幣 左右。如果您對 Linux 開發、自動導航或自走車專案有興趣,這絕對是一個物超所值的硬體平台。只要花一點心思刷入 Valetudo,它就不再是隱私外洩的潛在漏洞,而是一個完全受你掌控的強力研究工具。