從遠端控制走向自主維運:異常告警、雲端診斷與安全維護模式實測
HUB 8735 Ultra+JQ6500+Django,不只會播放地方故事,更能自行回報健康、接受安全維護命令,並在展場端保留必要的實體停止能力。
前一版 V1.0-13 已完成安全遠端命令、執行結果回報與逾時保護;V1.0-14 再向真正的展場自主維運前進。這次測試不是只確認「雲端按鈕能不能動」,而是驗證設備能否回答三個更重要的問題:設備現在健康嗎?需要維護時能否安全鎖定?維護結束後能否立即恢復服務?
一、V1.0-14增加了什麼?
| 功能 | 用途 | 展場價值 |
|---|---|---|
| 設備健康分數 | 依網路、播放器、事件佇列、復原次數與告警計算健康狀態 | 管理者不必到現場逐台檢查 |
| 異常告警 | 將故障或維護狀態同步到Django儀表板 | 快速辨認需要處理的設備 |
| RUN_DIAGNOSTIC | 由雲端要求設備產生完整診斷快照 | 遠端取得韌體、RSSI、按鈕、BUSY及JQ6500狀態 |
| MAINTENANCE_ON | 進入維護模式並阻擋一般播放與音量命令 | 避免維修時被觀眾誤觸啟動 |
| MAINTENANCE_OFF | 解除維護鎖定,恢復故事播放服務 | 完成維護後不必重新燒錄程式 |
| 復原頻率限制 | 限制單位時間內的播放器自動復原次數 | 防止故障設備陷入無限重置 |
二、雲端儀表板已成為展場維運中心
Django儀表板同時呈現展覽互動成果與設備健康資訊。管理者可以看見故事啟動、完整播放率、設備在線狀態、健康分數、健康等級、告警數、復原層級、最新診斷,以及最近一筆遠端命令結果。
BLOGGER_IMAGE_URL 換掉,圖片就能穩定顯示。三、第一階段:遠端完整診斷成功
我們先在Django後台建立 RUN_DIAGNOSTIC 命令。設備透過Heartbeat領取命令後,立即產生診斷快照,再把執行結果送回雲端。
[REMOTE] Heartbeat received RUN_DIAGNOSTIC [DIAGNOSTIC] fw=V1.0-14,health=100/GOOD,state=IDLE, track=0,vol=16,rssi=-27,queue=0,jq=0,busy=0, btn=111111,alert=NONE [REMOTE] Executed RUN_DIAGNOSTIC | result queued SUCCESS [REMOTE] Result ACK SUCCESS
診斷資料如何解讀?
| health=100/GOOD | 設備健康,沒有需要立即處理的異常。 |
|---|---|
| state=IDLE | 故事機處於待機狀態。 |
| vol=16 | JQ6500目前音量為16。 |
| rssi=-27 | Wi-Fi訊號非常良好。 |
| queue=0 | 沒有尚未同步的離線事件。 |
| jq=0 | 本次運作尚未發生JQ6500復原。 |
| busy=0 | 播放器沒有正在播放。 |
| btn=111111 | 六個按鈕皆為釋放狀態,沒有腳位異常拉低。 |
| alert=NONE | 目前沒有作用中的設備告警。 |
真正關鍵的不是看到 Executed,而是最後收到 Result ACK SUCCESS。這代表「雲端建立命令、設備領取、設備執行、結果回送、伺服器確認」五個環節全部完成。
四、第二階段:從雲端開啟維護模式
[REMOTE] Heartbeat received MAINTENANCE_ON [MAINTENANCE] Enabled by cloud [REMOTE] Executed MAINTENANCE_ON | result queued SUCCESS [REMOTE] Result ACK SUCCESS
維護模式不是關閉整台設備,而是選擇性鎖定具有風險的操作。故事播放及音量調整會被拒絕,但停止功能仍保留,讓現場人員遇到播放器異常時仍能立即處理。
| 維護模式中的操作 | 處理結果 | 設計理由 |
|---|---|---|
| 故事按鈕 | 拒絕 | 防止維修時意外啟動音訊 |
| Web故事播放 | 拒絕 | 避免遠端使用者干擾現場維護 |
| 音量+/- | 拒絕 | 維持檢修時的固定條件 |
| 停止按鈕 | 保留 | 確保現場仍可立即停止播放器 |
| 遠端診斷 | 保留 | 維護期間仍需觀察設備狀態 |
| 解除維護 | 保留 | 讓雲端可以安全恢復服務 |
五、實體按鈕真的被鎖住了嗎?
進入維護模式後,我們分別按下GPIO11烏龜故事與GPIO10白馬故事,系統確實讀到按鍵,但沒有啟動JQ6500:
[BUTTON] Pressed GPIO11 [MAINTENANCE] Story command rejected [BUTTON] Pressed GPIO10 [MAINTENANCE] Story command rejected
接著按下GPIO20停止鍵,系統仍然接受停止操作;因為當時播放器原本就在待機,所以正確回報:
[BUTTON] Pressed GPIO20 [STOP] Ignored: already idle
這個結果十分重要:維護模式沒有讓整個按鍵掃描停止,而是由命令層判斷哪些動作可以執行。設備仍持續掃描實體輸入,因此不會重演早期版本「網路工作時按鈕失去反應」的問題。
六、解除維護後立即恢復播放
[REMOTE] Heartbeat received MAINTENANCE_OFF [MAINTENANCE] Disabled by cloud [REMOTE] Executed MAINTENANCE_OFF | result queued SUCCESS [REMOTE] Result ACK SUCCESS
解除維護後再次按下GPIO10,白馬故事成功播放,雲端事件也正常寫入本機佇列:
[BUTTON] Pressed GPIO10 [CLOUD QUEUE] + SHUIJING-002-G68F044D7-0000000033 | STORY_START | pending=1 [JQ] Play track 1 [STATE] STORY_PLAYING | 白馬故事 [BUSY] 0 -> 1 | idle=0
這表示解除維護不需要重新開機,也不需要重新燒錄程式;實體按鈕、JQ6500播放、BUSY狀態與雲端事件佇列一起恢復正常。
七、為什麼一直看到NUL filtered=1?
[HEARTBEAT HTTP] NUL filtered=1 [HEARTBEAT] Accepted HTTP 200
這不是錯誤。實測發現Ameba SSL接收的HTTP封包偶爾會夾帶一個 0x00 NUL位元組。早期版本會因此無法解析HTTP狀態列或JSON;現在程式會先過濾NUL,再解析完整回應。
Accepted HTTP 200,就代表封包已修正並成功處理。這一行是防護機制的工作紀錄,不是通訊失敗。八、這次完整測試結果
- STA網路連線與HTTPS Heartbeat正常。
- Django成功送出RUN_DIAGNOSTIC命令。
- 設備回傳完整健康診斷快照。
- 命令執行結果收到雲端ACK。
- MAINTENANCE_ON成功啟用。
- 維護期間實體故事按鈕受到阻擋。
- 維護期間停止按鈕仍可使用。
- MAINTENANCE_OFF成功解除鎖定。
- 解除維護後白馬故事成功播放。
- STORY_START事件成功進入離線保護佇列。
- JQ6500 BUSY腳位正確由0切換至1。
- 設備健康分數100、等級GOOD、告警NONE。
水井三寶故事機已從「可以被遠端操作的播放器」,進一步成為「可以自我回報、接受安全維護、保留現場控制並完成雲端稽核」的展場智慧設備。
九、這次最寶貴的工程經驗
展場設備的可靠性,不只取決於功能多不多,而是發生異常時能不能被看見、被限制、被診斷、被恢復。V1.0-14建立的健康分數、異常告警、維護鎖定、遠端診斷與結果ACK,形成一條完整的維運證據鏈。
這也讓地方故事、樹藝作品與智慧展覽不再只是一次性的展示,而是可以長期運作、跨場域部署並由遠端團隊共同維護的數位文化服務。
測試平台:HUB 8735 Ultra、JQ6500、實體按鈕、LED、STA Wi-Fi、HTTPS、Django/PythonAnywhere。版本:V1.0-14「展場自主維運+異常告警+遠端診斷版」。
沒有留言:
張貼留言