2026 NASA 3! CSIE Wi-Fi
Meetings
:::spoiler 3/17
已完成
找出系館所有 AP
討論要選那些點測試訊號
決定記錄 BSSID、RSSI、Channel、Rx/Tx Ra
TODO
測 AP 數據 :::
:::spoiler 3/20
已完成
測 B1 的 AP
測 1F 的 AP
TODO
補測 1F 某些教室的 AP :::
:::spoiler 4/3
已完成
跟無線組組長開會
TODO
期中前
做一個 UI 把之前測的數據放上去
期中後
把這個地圖改成動態
目標:讓使用者可以向 NASA 團隊回報壞掉的 AP、訊號不佳的情況 :::
:::spoiler 4/5
已完成
完成網站的基本架構(使用 HTML)
TODO
導入 leaflet :::
:::spoiler 4/7
已完成
導入 leaflet
加入互動式功能
TODO
改成 React :::
:::spoiler 4/10
已完成
把網站前端改成 Vite + React
TODO
把網站搬到 VM 上
準備期中 demo :::
:::spoiler 4/19
已完成
搬到 VM 上
做 demo 簡報
討論期中後的目標
錄 demo 影片
TODO
完成 1F 的頁面 :::
:::spoiler 4/21
已完成
1F 頁面
把 B1 的點補齊
寫了更新網頁的 shell script
補完之前的會議紀錄
TODO
和無線組組長討論期中目標
看看能不能要到 SNMP 的唯讀權限 :::
:::spoiler 4/28
已完成
開會
問SNMP權限
要不要LDAP? 可能要
速度指標可以考慮用使用者測試到的速度/到計中的速度
架構
TODO
寫後端🥲 :::
:::spoiler 5/5
已完成
把單點的資訊改成熱力圖
新增二至五樓的頁面
新增測速功能
TODO
寫API文件🥲
導入SNMP數據🥲 :::
:::spoiler 5/26
已完成
進入 SNMP agent
TODO
期末 demo
~~登入系統~~
database 的 HA(備份、安全性)
SNMP 資料(做了測速系統但明顯無效)
webhook 回報
改成 UI/UX 組的地圖
製作AP點狀圖 :::
Workflow
Open an issue
Lables:
frontendfor frontend related issues,backendfor backend related issues,bugfor fix,enhancementfor feature, etc.
Work on a branches other than
mainbranchCommit with propoer commit messages
Open a pull request
Merge into
mainif no diffsElse, solve conficts
git pull origin main
:::warning :warning: 記得要寫 Document :::
Job Distribution
Layout
├── manage.py
├── requirements.txt
├── .env
│
├── config/ # Django project 總設定
│ ├── __init__.py
│ ├── settings.py # 需在此設定 Celery 與 JWT 參數
│ ├── urls.py
│ ├── asgi.py
│ ├── wsgi.py
│ └── celery.py # Celery 排程器的起始設定檔
│
├── auth_api/ #處理 LDAP 登入與 JWT 核發
│ ├── __init__.py
│ ├── services.py
│ ├── views.py # 提供 /api/login 端點
│ └── urls.py
│
├── devices/ # AP 設備靜態資料 (SQLite)
│ ├── models.py
│ ├── serializers.py
│ ├── views.py
│ ├── urls.py
│ └── admin.py
│
├── measurements/ # 測量結果與報修紀錄 (SQLite / InfluxDB)
│ ├── models.py
│ ├── serializers.py
│ ├── views.py
│ ├── urls.py
│ └── admin.py
│
├── iperf_api/ # iperf 測速 API (主動測量)
│ ├── __init__.py
│ ├── services.py
│ ├── serializers.py
│ ├── views.py
│ └── urls.py
│
├── snmp_api/ # SNMP 讀取 API (背景輪詢)
│ ├── __init__.py
│ ├── services.py
│ ├── tasks.py # 定義每分鐘定時執行的 Celery Task
│ ├── views.py # 提供給前端畫歷史折線圖的 API
│ └── urls.py
│
└── heatmap/ # 給前端 Leaflet 用的熱力圖 JSON
├── __init__.py
├── views.py
└── urls.py
Data
::: spoiler B1
AP正下方
csie-5G
測點ID |
測量時間 |
BSSID |
Channel |
RSSI(dBm) |
Rx rate |
Tx rate |
Rx rate (PHY) |
Tx rate (PHY) |
|---|---|---|---|---|---|---|---|---|
B02 |
0320.16:18 |
F8‑E7‑1E‑66‑45‑3C |
36 |
-37 |
220.7 |
188.4 |
400 |
400 |
B00 |
0320.16:33 |
30‑87‑D9‑71‑6B‑2C |
44 |
-36 |
168.2 |
159.9 |
360 |
400 |
B15 |
0320.16:42 |
30‑87‑D9‑71‑96‑4C |
36 |
-39 |
194.4 |
194.4 |
360 |
400 |
B04 |
0320.16:48 |
34‑8F‑27‑5E‑7A‑8C |
116 |
-35 |
241.1 |
212.5 |
400 |
400 |
B09 |
0320.17:00 |
30‑87‑D9‑71‑96‑EC |
100 |
-57 |
150.3 |
176.4 |
270 |
324 |
B05 |
0320.17:20 |
30‑87‑D9‑71‑7F‑CC |
108 |
-36 |
218.2 |
275.9 |
360 |
400 |
csie
測點ID |
測量時間 |
BSSID |
Channel |
RSSI(dBm) |
Rx rate |
Tx rate |
Rx rate (PHY) |
Tx rate (PHY) |
|---|---|---|---|---|---|---|---|---|
B02 |
0320.16:18 |
F8‑E7‑1E‑26‑45‑39 |
6 |
-37 |
49.2 |
38.2 |
144.4 |
144.4 |
B00 |
0320.16:37 |
30‑87‑D9‑31‑6B‑29 |
1 |
-59 |
9.4 |
11.6 |
130 |
52 |
B15 |
0320.16.41 |
30‑87‑D9‑31‑96‑49 |
1 |
-52 |
13.9 |
60 |
144 |
104 |
B04 |
0320.16:46 |
34‑8F‑27‑1E‑7A‑89 |
6 |
-34 |
47.5 |
27.0 |
144 |
144 |
B09 |
0320.16:57 |
30‑87‑D9‑31‑96‑E9 |
6 |
-34 |
41.7 |
24.3 |
144 |
144 |
B05 |
0320.17:17 |
30‑87‑D9‑31‑7F‑C9 |
1 |
-35 |
19.4 |
4.2 |
65 |
144 |
兩個AP中間
csie-5G
測點ID |
測量時間 |
連到的AP |
RSSI(dBm) |
Rx rate |
Tx rate |
Rx rate (PHY) |
Tx rate (PHY) |
|---|---|---|---|---|---|---|---|
M1 |
0320.17:25 |
B02 |
-59 |
114.0 |
108.7 |
270 |
240 |
M2 |
0320.16:54 |
B15 |
-49 |
201.3 |
201.7 |
360 |
400 |
M3 |
0320.17:05 |
B15 |
-44 |
178.2 |
194.9 |
360 |
360 |
M4 |
0320.17:23 |
B15 |
-62 |
97.3 |
125.9 |
216 |
216 |
csie
測點ID |
測量時間 |
連到的AP |
RSSI(dBm) |
Rx rate |
Tx rate |
Rx rate (PHY) |
Tx rate (PHY) |
|---|---|---|---|---|---|---|---|
M1 |
0320.17:27 |
B02 |
-51 |
31.1 |
44.9 |
130 |
115 |
M2 |
0320.16:50 |
B04 |
-40 |
14.1 |
18.4 |
130 |
117 |
M3 |
0320.17:02 |
B04 |
-64 |
4.5 |
13.6 |
104 |
117 |
M4 |
0320.17:22 |
B09 |
-49 |
36.2 |
16.2 |
144 |
130 |
遠點
csie-5G
測點ID |
測量時間 |
連到的AP |
RSSI(dBm) |
Rx rate |
Tx rate |
Rx rate (PHY) |
Tx rate (PHY) |
|---|---|---|---|---|---|---|---|
R1 |
0320.17:28 |
B00 |
-57 |
133.9 |
115.5 |
324 |
300 |
R2 |
0320.17:09 |
B15 |
-48 |
192.6 |
216.1 |
360 |
400 |
R3 |
0320.17:11 |
B15 |
-56 |
166.8 |
170.4 |
270 |
243 |
csie
測點ID |
測量時間 |
連到的AP |
RSSI(dBm) |
Rx rate |
Tx rate |
Rx rate (PHY) |
Tx rate (PHY) |
|---|---|---|---|---|---|---|---|
R1 |
0320.17:29 |
B00 |
-63 |
6.6 |
5.5 |
104 |
117 |
R2 |
0320.17:08 |
B09 |
-53 |
22.3 |
17.3 |
144 |
104 |
R3 |
0320.17:10 |
B09 |
-52 |
37.2 |
17.4 |
117 |
130 |
::: |
:::spoiler 1F

AP正下方
csie-5G
測點ID |
測量時間 |
BSSID |
Channel |
RSSI(dBm) |
Rx rate |
Tx rate |
Rx rate (PHY) |
Tx rate (PHY) |
|---|---|---|---|---|---|---|---|---|
R102 |
0324.9:46 |
30‑87‑D9‑71‑79‑EC |
108 |
-30 |
256.4 |
231.5 |
400 |
400 |
R103(人多) |
0324.13:15 |
30‑87‑D9‑71‑98‑CC |
100 |
-40 |
172.2 |
159 |
400 |
400 |
R106(有問題) |
0324.9:55 |
30‑87‑D9‑71‑99‑4C |
60 |
-62 |
141 |
157.7 |
270 |
270 |
R110 |
0324.10:02 |
30‑87‑D9‑71‑52‑4C |
132 |
-35 |
273.4 |
235.5 |
400 |
400 |
R101 |
0324.10:18 |
30‑87‑D9‑71‑55‑4C |
44 |
-34 |
250 |
241.3 |
400 |
400 |
R104(人多) |
0324.13:21 |
34‑8F‑27‑5A‑E4‑CC |
116 |
-33 |
162.4 |
92.7 |
360 |
400 |
R105 |
0324.10:19 |
30‑87‑D9‑31‑6B‑AC |
36 |
-33 |
244.7 |
264.9 |
360 |
400 |
R107 |
0324.10:28 |
30‑87‑D9‑71‑59‑8C |
44 |
-40 |
253.4 |
236.3 |
400 |
400 |
R111 |
0324.10:31 |
30‑87‑D9‑71‑83‑0C |
132 |
-38 |
227.1 |
239.1 |
360 |
360 |
csie
測點ID |
測量時間 |
BSSID |
Channel |
RSSI(dBm) |
Rx rate |
Tx rate |
Rx rate (PHY) |
Tx rate (PHY) |
|---|---|---|---|---|---|---|---|---|
R102 |
0324.9:44 |
30‑87‑D9‑31‑79‑E9 |
1 |
-41 |
40.1 |
31.1 |
130 |
130 |
R104 |
0324.13:21 |
34‑8F‑27‑1A‑E4‑C9 |
11 |
-27 |
24.4 |
56.4 |
144 |
144 |
R106(有問題) |
0324.9:50 |
30‑87‑D9‑31‑52‑49 |
6 |
-60 |
25.7 |
27.2 |
144 |
78 |
R110 |
0324.10:01 |
30‑87‑D9‑31‑52‑49 |
6 |
-25 |
68.4 |
35.4 |
130 |
144 |
R101 |
0324.10:09 |
30‑87‑D9‑31‑55‑49 |
6 |
-31 |
43.4 |
41.7 |
144 |
130 |
R105 |
0324.10:19 |
30‑87‑D9‑31‑6B‑A9 |
6 |
-29 |
55.5 |
31.8 |
144 |
144 |
R107 |
0324.10:27 |
30‑87‑D9‑31‑59‑89 |
6 |
-40 |
49.7 |
27.3 |
130 |
144 |
R111 |
0324.10:30 |
30‑87‑D9‑31‑83‑09 |
11 |
-31 |
37.0 |
54.3 |
144 |
144 |
兩個AP中間
csie-5G
測點ID |
測量時間 |
連到的AP |
RSSI(dBm) |
Rx rate |
Tx rate |
Rx rate (PHY) |
Tx rate (PHY) |
|---|---|---|---|---|---|---|---|
M5 |
0324.10:56 |
R107 |
-54 |
212.0 |
231.3 |
324 |
360 |
M6 |
0324.10:52 |
R107 |
-55 |
203.8 |
232.5 |
270 |
360 |
csie
測點ID |
測量時間 |
連到的AP |
RSSI(dBm) |
Rx rate |
Tx rate |
Rx rate (PHY) |
Tx rate (PHY) |
|---|---|---|---|---|---|---|---|
M5 |
0324.10:52 |
R107 |
-49 |
42.3 |
28.5 |
130 |
144 |
M6 |
0324.10:52 |
R111 |
-49 |
45.5 |
22.2 |
130 |
130 |
::: |
測量時的觀察
從舊館走到新管會先連到N3,N3跟N4需移動較遠的距離才會做切換
在N1下方可能會連到牆內的N1,導致訊號不佳
N2,N3,N6不易切換
在M3,csie_5g連到B04很怪
在B05正下方會連到B09(B05_AP會閃黃燈)(csie的部分)
R106信號特別弱,很常連上後又斷掉(AP亮黃燈)
手機不一定可以連到
R104在紀錄時人有點多
API文件
:::spoiler heatmap
POST /api/heatmap/measurements/create/
(新增一筆wifi測量資料)
request body
{
"floor": "basement",
"point_id": "b00",
"x": 65.2,
"y": 51.3,
"note": "新館空曠區域",
"ssid": "csie-5G",
"bssid": "xx:xx:xx:xx:xx:xx",
"channel": 36,
"rssi": -36,
"rx_rate": 866.7,
"tx_rate": 780.0
}
success response
{
"message": "created",
"data": {
"id": 1,
"floor": "basement",
"point_id": "b00",
"x": 65.2,
"y": 51.3,
"note": "新館空曠區域",
"ssid": "csie-5G",
"bssid": "xx:xx:xx:xx:xx:xx",
"channel": 36,
"rssi": -36,
"rx_rate": 866.7,
"tx_rate": 780.0,
"measured_at": "2026-05-11T10:30:00+08:00"
}
}
error response
{
"message": "invalid data",
"errors": {
"rssi": \["This field is required."]
}
}
GET /api/heatmap/measurements/
(取得wifi資料列表)
參數 |
說明 |
範例 |
|---|---|---|
floor |
篩選樓層 |
basement,floor1 |
ssid |
篩選wifi名稱 |
csie,csie-5G |
bssid |
篩選AP MAC位址 |
aa:bb:cc:dd:ee:ff |
limit |
限制回傳筆數,預設500,最大2000 |
100 |
example request
GET /api/heatmap/measurements/?floor=basement&ssid=csie-5G&limit=100
GET /api/heatmap/
(取得給前端heatmap的資料)
參數 |
說明 |
範例 |
|---|---|---|
floor |
篩選樓層 |
basement,floor1 |
ssid |
篩選wifi名稱 |
csie,csie-5G |
bssid |
篩選AP MAC位址 |
aa:bb:cc:dd:ee:ff |
min_rssi |
篩選RSSI下限,保留大於等於此值的資料 |
-70 |
max_rssi |
篩選RSSI上限,保留小於等於此值的資料 |
-35 |
limit |
限制回傳筆數,預設 5000,最大 10000 |
1000 |
example request
GET /api/heatmap/?floor=basement&ssid=csie-5G&min_rssi=-70&limit=1000
response
{
"count": 1,
"metric": "rssi",
"coordinate": "xy-percent",
"floor": "basement",
"data": [
{
"id": 1,
"floor": "basement",
"x": 65.2,
"y": 51.3,
"value": 1.0,
"rssi": -36,
"point_id": "b00",
"note": "新館空曠區域",
"ssid": "csie-5G",
"bssid": "xx:xx:xx:xx:xx:xx",
"channel": 36,
"rx_rate": 866.7,
"tx_rate": 780.0,
"measured_at": "2026-05-11T10:30:00+08:00"
}
]
}
Heatmap Value
value 是由 rssi 轉換而來,數值越大代表訊號越強。
例如:
RSSI = -36,value = 0.85
RSSI = -60,value = 0.45
RSSI = -90,value = 0.03 :::
:::spoiler client
POST api/iperf/run
(執行 iperf3 網路測速)
request body
參數 |
說明 |
範例 |
|---|---|---|
target_ip |
目標設備的 IP 位址(須為合法的 IPv4/IPv6,且目標設備需運行 iperf3 -s) |
“192.168.1.100” |
duration |
測量時間(秒),預設值為 5,限制範圍為 1 到 30 |
10 |
{
"target_ip": "192.168.1.100",
"duration": 10
}
success response (HTTP 200 OK)
{
"success": true,
"target_ip": "192.168.1.100",
"download_mbps": 850.55
}
error response - Validation Error (HTTP 400 Bad Request)
當輸入不合法的 IP 格式或超出範圍的測量時間時回傳:
{
"target_ip": [
"Enter a valid IPv4 or IPv6 address."
]
}
GET /api/iperf/download/
(下載 100MB 的隨機檔案,用於 HTTP 下載測速)
example request
GET /api/iperf/download/
response (HTTP 200 OK)
Content-Type:
application/octet-streamResponse Body: 100MB 的隨機二進位資料 (Dummy data)
Headers: 包含強制禁止快取的標頭,確保每次測速都是實際走網路傳輸:
Cache-Control:no-cache,no-store,must-revalidatePragma:no-cacheExpires:0:::
REST API互動基本流程
proxmox上的vm -(HTTP request)-> Ruckus vSZ Controller REST API -(JSON response)-> ap解析資料