本文是物聯網智慧路燈應用程式碼解析(上)的下篇。上篇我們介紹智慧路燈應用註冊裝置和獲取上報資料的實現原理,本文我們繼續介紹智慧路燈應用其他功能的實現。
智慧路燈應用註冊裝置成功後,介面上會顯示下半部分的內容。
燈狀態與環境亮度
這三個元件中,燈狀態和環境亮度均會根據裝置上報的資料重新整理。首先讓我們檢視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),當前上報環境光強小於閾值且燈狀態為關時下發開燈命令,大於閾值且燈狀態為開時下發關燈命令,只要滿足條件就一直重複下發。
至此,智慧路燈應用的程式碼全部解析完畢,各位同學如果想要修改某個功能,只要修改該功能對應的函式就行,若想要替換成路燈以外的裝置,只要根據產品模型和業務邏輯重新設計程式碼邏輯還行,核心的“註冊裝置-獲取資料-下發命令”的邏輯是不變的。
新增華為IoT小助手(微訊號:huawei-iot,回覆“部落格園”)獲取此物聯網免費學習課程。