你已經把整條資料路徑做出來了:四協定模擬 → Priority Queue → Protocol Adapter → n8n → 儲存/告警/視覺化,
在大學部專題裡這是非常完整的成果,工程整合面值得肯定 👍。
接下來這份指南要帶你補上「研究」的骨架:把量錯的效能數據修正、
讓數據變得真實可比較、設計對照實驗回答研究問題,
最後寫成可以上台口試的報告。
| 模組 | 狀態 | 還要做什麼 |
|---|---|---|
| asyncio 四協定模擬 | ✅ 完成 | 感測值改用真實模型(Phase ②) |
| Priority Queue | ✅ 完成 | 量化它對告警延遲的改善(Phase ③) |
| Protocol Adapter 橋接 | ✅ 完成 | 量化橋接開銷=主要研究貢獻(Phase ③/🏆) |
| 效能量測 | ⛔ 量錯 | 改成端到端量測(需要修正) |
| MQTT Broker | ⚠ 需換 | 公開 broker → 本機 Docker(Phase ①) |
| HTML 儀表板 / n8n / Grafana | ✅ 完成 | 維持;當作展示與資料蒐集管道 |
| Google Sheets 資料遺失 | ⚠ 待查 | 找出原因=可靠度分析素材(Phase ④) |
| 研究問題 / 對照實驗 | ⛔ 缺 | 設計實驗(Phase ③) |
| 論文 / 口試報告 | ⛔ 缺 | 架構圖+數據圖表+章節(Phase ⑤) |
「🔧 需要修正」+「📐 真實數據量測」
這是讓你的數字「能用」的前提,最優先。
五個分頁就是你接下來一學期的工作清單,每頁都有任務、交付物、完成標準。
「🏆 貢獻亮點」挑一個方向深挖,當作論文的主要貢獻。
這三件事不修,後面的實驗數據都不能用。它們不難改,但很關鍵。
你目前(照教材挑戰 2)是在 publish() 前後抓時間。但因為開了 loop_start(),paho 的 publish() 是「非阻塞」的—— 它只是把訊息丟進程式內部的佇列就馬上回傳(微秒級),根本還沒送到網路、更沒到對方。 所以你量到的是「丟進佇列的時間」,不是真正的端到端延遲。
# loop_start() 後 publish 非阻塞 t_start = time.time() publish(topic, data) # 立刻回傳 t_end = time.time() lat = (t_end - t_start)*1000 # ≈ 0.01 ms
# 送端:送出前埋時間戳 data["t_send"] = time.time() publish(topic, data) # 收端(Adapter / 儀表板): recv = time.time() e2e_ms = (recv - data["t_send"])*1000
現在四個協定都用 random.uniform() 生資料,除了 sleep 間隔不同,本質一模一樣。 但題目是「跨協定效能橋接」——如果協定之間沒有真實差異,就沒有東西可以「比較」,研究就立不起來。
val = random.uniform(20, 40) await asyncio.sleep(10) # LoRa 跟 WiFi 只差 sleep 秒數
# LoRa:高延遲、會掉封包 await asyncio.sleep(net_delay["lora"]) if random.random() < loss["lora"]: continue # 模擬掉包,不發送
每個協定要套不同的延遲分佈、封包遺失率、抖動(實際數值見「📐 真實數據量測」分頁,並查文獻佐證)。這樣「LoRa vs WiFi 的橋接表現」才有意義。
你在報告 slide 7 已經發現 home/# 全是「別人的流量=雜訊」。這正是用公開 broker.emqx.io 的副作用:未知的跨流量、限流、不保證送達, 任何效能數字都無法重現。做量測前,一定要改成本機自己跑的 broker。
# 一行指令在本機跑一個 MQTT broker(裝好 Docker 後) docker run -d --name mqtt -p 1883:1883 -p 9001:9001 eclipse-mosquitto # 然後把程式裡的 BROKER 從 "broker.emqx.io" 改成 "localhost"
「研究」跟「Demo」最大的差別,就是你能不能拿出可信、可重現、能互相比較的數字。 這一頁告訴你:① 要量哪些指標 ② 在哪裡量 ③ 每個協定該有的真實特性 ④ 結果長什麼樣。
端到端 ms。不要只看平均,要看中位數 / p95 / p99(最慢的那 5% 才是關鍵)。
每秒成功處理幾筆(msg/s)。拉高裝置數看上限。
延遲的標準差。越穩定越小,對即時性很重要。
每筆加序號,收端數缺號 → 遺失率(%)。
用 psutil 記錄 Adapter 行程的 CPU、記憶體。
訊息在 Priority Queue 裡等多久才被取出。
下面是教科書上各協定的典型數量級,請學生再查 1–2 篇文獻佐證後,把這些數字寫進模擬器的延遲/遺失模型:
| 協定 | 典型延遲 | 頻寬 | 距離 | 遺失傾向 | 特性 |
|---|---|---|---|---|---|
| 📡 LoRa | 秒級(~1–10 s) | 0.3–50 kbps | 2–15 km | 高 | 省電、長距、有 duty cycle 限制 |
| 💙 BLE | 毫秒~秒 | ~1 Mbps | 10–100 m | 低 | 短封包、低功耗 |
| 🔆 Zigbee | ~15–30 ms | 250 kbps | 10–100 m | 中 | Mesh 多跳、家庭自動化常用 |
| 📶 WiFi | 1–10 ms | 數十 Mbps↑ | ~50 m | 低 | 高頻寬、較耗電 |
→ 套進去之後,「LoRa 在橋接後延遲最大、WiFi 最小」這種結論才有真實依據,不是亂數。
你的結果表應該長這樣(每格都是 30 次重複的統計):
| 協定 | 延遲 p50 | p95 | 遺失率 | 吞吐 |
|---|---|---|---|---|
| LoRa | — | — | — | — |
| BLE | — | — | — | — |
| Zigbee | — | — | — | — |
| WiFi | — | — | — | — |
把「—」填上真實數字,再配一張長條圖,就是一頁紮實的實驗結果。
整個研究的地基。地基不穩,後面全白做。
建立一套可信、可重現的量測工具與環境,能正確量出端到端延遲、吞吐、抖動、遺失率、資源使用,並輸出統計(p50/p95/p99)。
import statistics, csv, psutil lat = [] # 收集每筆端到端延遲 recv_seq = set() # 收到的序號 def on_message(data): lat.append((time.time() - data["t_send"])*1000) recv_seq.add(data["seq"]) def report(total_sent): p = statistics.quantiles(lat, n=100) return { "p50": statistics.median(lat), "p95": p[94], "p99": p[98], "loss_%": (1 - len(recv_seq)/total_sent)*100, "cpu_%": psutil.cpu_percent(), }
① 本機 broker 環境
② 量測模組(輸出 CSV)
③ 一份 baseline 數據表
同一組設定連跑兩次,p50/p95 差距 < 10%(代表環境穩定、數字可重現)。
給四個協定各自的脾氣,跨協定比較才有意義。
把「隨機數字」升級成「有協定特性的數字」:每個協定有自己的延遲、遺失率、抖動模型。 (進階)至少接一條真實協定路徑來校準,證明你的模擬可信。
PROFILE = {
"lora": {"delay": (1.0, 3.0), "loss": 0.08}, # 高延遲、8% 掉包
"zigbee": {"delay": (0.015,0.03),"loss": 0.02},
"ble": {"delay": (0.05, 0.2), "loss": 0.01},
"wifi": {"delay": (0.001,0.01),"loss": 0.005},
}
# 數值請以「📐 真實數據量測」的表+文獻為準
① 有文獻依據的協定參數表
② 改造後的模擬器
③(進階)一份模擬 vs 真實校準對照
四協定跑出來的延遲/遺失明顯不同且符合常識(LoRa 最差、WiFi 最好)。
這一步是「研究」的靈魂——你到底在「比較」什麼?
一份研究要先問問題,再用實驗回答。建議從這三題選 1–2 題深入:
Protocol Adapter 的延遲與資源開銷,如何隨「訊息量 / 協定數」成長?有 Adapter vs 沒 Adapter 差多少?
Priority Queue 對「緊急告警延遲」改善多少?Priority Queue vs 一般 FIFO 在高負載下的差異?
MQTT QoS 0 / 1 / 2 在「遺失率」與「延遲」之間怎麼權衡?這也能解釋你 Google Sheets 為何掉資料。
每個實驗都要分清楚三種變數:
+ 固定變數:其它全部不動(同一台機器、同一 broker、同樣跑 N 次)。
每個 RQ 都有一張「自變數 vs 應變數」的圖,並能用一句話回答它。
找出系統的極限,並解釋資料為什麼會掉。
裝置數 / 訊息率一路往上加(1 → 10 → 100 → 1000),看延遲在哪裡開始爆掉、吞吐在哪裡到頂。
你報告裡提到「Google Sheets 還是會掉資料」。別把它當 bug 帶過——把原因拆開、各佔多少,本身就是一段漂亮的可靠度分析。
MQTT QoS 0 不保證送達,網路一忙就丟。改 QoS 1 看遺失率變化。
Code 節點批次緩衝(每 5/7/15 筆),程式結束前最後不滿一批的資料沒送出。
n8n / broker 重啟期間的訊息直接消失。
Google Sheets API 有頻率上限,太密集會被擋。
做法:用「序號數缺號」逐一隔離各原因的貢獻度,畫成「遺失率 vs QoS / 負載」曲線。
能說出「系統在 ___ 台裝置崩潰」「資料遺失主因是 ___,改 ___ 後降到 ___%」。
做得再好,寫不出來=沒人看得懂。最後這步把成果變成可交付的報告。
IoT 多協定的問題、為何需要閘道器與橋接、你的目標。
別人怎麼做 IoT gateway / 協定轉換,你跟他們的差別。
放你的架構圖、資料流、統一 schema、各模組職責。
量測點、指標定義、實驗設計、環境(本機 broker、重複 N 次)。
RQ 一題一節,每節配圖表+統計。
結果代表什麼、為何如此、限制在哪。
回答 RQ、貢獻、後續可延伸方向。
程式碼、設定檔、完整數據表。
一步步教別人重現你的實驗。
鎖定套件版本。
docker-compose + 啟動所有模擬器。
協定參數、實驗設定集中管理。
每張圖背後的數據都附上。
Grafana、n8n flow、儀表板畫面。
一份研究要講得出「我的貢獻是什麼」。下面四個方向,挑一個深挖當主軸,其它當輔助或未來工作即可。
最貼題目(「效能橋接研究」),而且你已經把 Adapter 做好了,只差「量它」。 回答:橋接增加多少延遲?吃多少資源?隨協定數/負載怎麼成長?瓶頸在哪?——這一條就足以撐起整份論文的主貢獻。
依協定特性自動選 QoS(LoRa 用 0、告警用 1/2),比較固定 QoS 的效能與可靠度。
Adapter 放本機 vs 放雲端,比較延遲與頻寬成本的取捨。
目前公開 broker 明文傳輸。加 TLS / 認證,量測「加密讓效能掉多少」。