【華爲雲技術分享】【我的物聯網成長記20】物聯網智慧路燈應用代碼解析(下)

本文是物聯網智慧路燈應用代碼解析(上)的下篇。上篇我們介紹智慧路燈應用註冊設備和獲取上報數據的實現原理,本文我們繼續介紹智慧路燈應用其他功能的實現。

智慧路燈應用註冊設備成功後,界面上會顯示下半部分的內容。

燈狀態與環境亮度

這三個組件中,燈狀態和環境亮度均會根據設備上報的數據刷新。首先讓我們查看index.html,查看會刷新的內容對應的id和class。

因爲這些數據應該是在應用獲取到設備上報數據時刷新,所以讓我們回去查看上篇中我們在common.js中找到的getDis()函數和getSub()函數。

可以看到,這兩個函數的fuction實現是相同的,都是根據從後端獲取的值,刷新前端信息,刷新的項也就是我們剛纔在index裏看到的那幾項。

路燈控制

最後來看下路燈控制模塊。路燈控制可以選擇三種開關模式,分別是終端聯控模式(terminal),分段定時模式(timeRange)和自動調光模式(autoLux)。

終端聯控模式

查看HTML代碼,可以看到終端聯控模式是直接設置開關後觸發common.js中的setOpenClose()函數。

查看函數,看到該函數是攜帶開關燈狀態調用/set-open-close接口。

/set-open-close接口對應SetOpenClose類中的setPara(@RequestBody  String onOff)函數,但我們可以看到,該函數只是設置了TempDatabase中ctrlMode和onOffSetter的值,並沒有給設備下發命令,那麼應用是什麼時候給設備下發命令的?

從應用邏輯上來說,如果不是在設置命令時直接下發,那麼就肯定是在其他事件被觸發時或者定時任務中下發。“命令”、“定時任務”這兩個關鍵詞是不是很眼熟?我們之前查看定時獲取數據函數(getDIsData()和getDeviceData())時看到的createDeviceCommand.runSetCommand(slMsg);這行代碼從字面上解釋不就是下發命令的意思麼?

於是我們打開createDeviceCommand類,查看runSetCommand(StreetLightMsg streetLightMsg)函數。這個函數會判斷ctrlMode進行不同的處理。對於terminal模式,應用根據命令指定的狀態和路燈當前狀態判斷是否下發命令,即命令設置爲開且路燈當前狀態爲關時下發開燈命令,命令設置爲關且路燈當前狀態爲開時下發關燈命令,其餘情況不下發命令。

實際下發命令是調用了同一個類中的setCommand(String command)函數,這個函數通過調用設備接入服務的下發設備命令接口實現命令下發。

綜上所述,用戶在界面上點擊設置命令狀態後,應用只是設置了控制模式和開關燈參數,然後在定時任務中檢查參數,滿足條件時就進行下發。例如,燈狀態爲關時設置命令狀態爲開,應用就會定時給設備下發開燈命令,直到設備上報開燈狀態或用戶設置命令狀態爲關。

分段定時模式

分段定時模式是通過兩個時間控件讓用戶選擇關燈時間段後調用setTimeRange()函數。

setTimeRange()函數調用/set-time-range接口,攜帶用戶設置的時間段。

/set-time-range接口對應TimeRangeCtrl類的setPara(@RequestBody TimeRange value)函數,和終端聯控模式一樣並沒有直接下發命令,只是設置了控制模式和時間段。

查看createDeviceCommand類的runSetCommand(StreetLightMsg streetLightMsg)函數,可以看到控制模式爲timeRange時,應用通過調用Time類的isInTimeMain(String startTime, String endTime, String dateStr)函數判斷當前時間是否在設置的關燈時間段內,然後如果燈狀態爲開且在關燈時間段內,下發關燈命令;燈狀態爲關且不在關燈時間段內,下發開燈命令。同樣因爲是定時任務,滿足條件後命令會反覆下發直到設備上報的燈狀態變化或時間超過時間段。Time類是智慧錄音應用自定義的一個用於判斷當前時間是否在時間段內的工具類,本文不進行詳述,感興趣的同學可以自己查看源碼。

自動調光模式

自動調光模式調用setDeviceLuxThreshold(btn)函數,該函數又調用/threshold接口,攜帶用戶設置的閾值。

 

/threshold接口對應SetCustomData類中的setThreshold(@RequestBody Threshold value)函數,設置控制模式和閾值。

查看createDeviceCommand類的runSetCommand(StreetLightMsg streetLightMsg)函數,可以看到控制模式爲autoLux時,若閾值爲有效值(大於0),當前上報環境光強小於閾值且燈狀態爲關時下發開燈命令,大於閾值且燈狀態爲開時下發關燈命令,只要滿足條件就一直重複下發。

至此,智慧路燈應用的代碼全部解析完畢,各位同學如果想要修改某個功能,只要修改該功能對應的函數就行,若想要替換成路燈以外的設備,只要根據產品模型和業務邏輯重新設計代碼邏輯還行,核心的“註冊設備-獲取數據-下發命令”的邏輯是不變的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章