開發獲取溫度數據的服務
在業務邏輯工作臺,開發三個業務服務,分別用于獲取設備上報的溫度數據,每整點統計前一小時的最高溫度數據,和篩選指定時間段內每小時的最高溫度數據。
前提條件
已完成以下操作:
開發設備有不同的方法,用戶可根據實際場景需要,選擇相應的設備開發方法。本案例以開發虛擬設備為例。
操作步驟
在開發工具模塊,單擊業務邏輯。
在業務邏輯開發頁面,單擊空白模板區域。
創建一個設備觸發服務。
該服務以溫度監測器設備作為觸發節點,接收溫度監測器設備上報的溫度數據,并存儲到云數據庫RDS版MySQL數據表中。
輸入業務邏輯服務的基本信息并單擊確認。
參數
說明
服務名稱
服務的唯一標識符,在項目下具有唯一性。例如:存儲溫度數據
僅支持中文漢字、英文字母、數字、下劃線(_)、連接號(-)和英文圓括號(()),且必須以中文漢字、英文字母或數字開頭,長度不超過30個字符(一個中文漢字算一個字符)。
所屬項目
服務所屬的項目。本案例選擇已創建的項目:茶園監控方案。
備注
描述服務的用途等信息。長度不超過100個字符(一個中文漢字算一個字符)。
從服務編輯器左側節點頁簽下,拖拽一個設備觸發節點到畫布上,并配置輸入數據為溫度監測器上報的屬性。
配置一個云數據庫MySQL節點,用于將溫度監測器上報的溫度數據存入數據表sensor_data。節點配置具體操作,請參見節點配置。
本示例中,輸入的參數如下所示。
{ "table": "sensor_data", "rows": [ { "id":"{{payload.deviceContext.gmtCreate}}", "deviceName" : "{{payload.deviceContext.deviceName}}", "dateTime" : "{{payload.props.temperature.time}}", "temperature" : "{{payload.props.temperature.value}}" } ] }
單擊部署調試按鈕,部署并啟動服務。
說明本案例是以開啟虛擬設備上報數據,無需再次部署調試。具體操作,請參見開發虛擬設備。
創建一個定時觸發服務。
該服務用于每整點統計前一小時的最高溫度數據,并存儲到云數據庫RDS版MySQL數據表中。
切換到服務列表頁面,單擊服務列表右側的添加圖標。
在業務邏輯開發頁面,創建并設置定時觸發服務。
配置一個定時觸發節點,用于每整點觸發一次服務。
配置一個云數據庫MySQL節點,用于從存儲設備上報的溫度數據的數據表sensor_data中,查詢數據。
本示例中,查詢數據的輸入參數如下所示。
{ "table": "sensor_data", "condition": { "where": {"deviceName": "bZxNh9qi6PyqYvFcDvqK"}, "columns": [ "id", "deviceName", "temperature", "dateTime" ], "orders": ["temperature"] } }
配置一個Node.js節點,用于提取每小時內,設備上報的最高溫度。
本示例中,輸入的腳本如下所示。
/** * @param {Object} payload 上一節點的輸出 * @param {Object} node 指定某個節點的輸出 * @param {Object} query 服務流第一個節點的輸出 * @param {Object} context { appKey, appSecret } */ module.exports = async function(payload, node, query, context) { console.log("payload: ", payload); let result = {}; result.index = payload.length - 1; result.maxTemperature = payload[result.index].temperature; result.id = payload[result.index].id; result.deviceName = payload[result.index].deviceName; result.dateTime = payload[result.index].dateTime; return result; }
再配置一個云數據庫MySQL節點,用于將Node.js處理后的數據存入數據表Maxtemperature。
本示例中,輸入的參數如下所示。
{ "table": "Maxtemperature", "rows": [{ "id": "{{payload.id}}", "deviceName": "{{payload.deviceName}}", "dateTime": "{{payload.dateTime}}", "maxTemperature": "{{payload.maxTemperature}}" }] }
單擊部署調試按鈕,部署并啟動服務。
單擊部署調試按鈕,輸入模擬時間,調試服務。
創建一個HTTP接口,用于實現篩選指定時間段的數據。
參照步驟5中的子步驟1和子步驟2,新增一個服務(例如獲取溫度數據)。
配置一個HTTP請求節點,設置篩選溫度數據API的Action名稱和請求參數。
本示例中,配置了以下三個請求參數。
參數
類型
是否必需
說明
DeviceName
String
否
調用接口時,傳入設備名稱,查詢指定設備上報的溫度數據;不傳入設備名稱,則返回全部設備的溫度數據。
startTime
Int
是
調用接口時,需傳入要查詢數據的起始時間。
endTime
Int
是
調用接口時,需傳入要查詢數據的結束時間。
配置一個云數據庫MySQL節點,用于從數據表Maxtemperature中獲取每小時的最高溫度數據。
本示例中,輸入的參數如下所示。
{ "table": "maxtemperature", "condition": { "where": { "deviceName": "{{payload.DeviceName}}" }, "columns": [ "maxTemperature", "dateTime" ], "orders": [ "dateTime" ] } }
配置一個Node.js節點,用于篩選指定時間段內的溫度數據。
本示例中,輸入的腳本如下所示。
/** * @param {Object} payload 上一節點的輸出 * @param {Object} node 指定某個節點的輸出 * @param {Object} query 服務流第一個節點的輸出 * @param {Object} context { appKey, appSecret } */ module.exports = async function(payload, node, query, context) { console.log("payload: ", payload); let length = 0; for (let i = 0; i < payload.length; i++) { if(parseInt(payload[i].dateTime) >= query.startTime*1000 && parseInt(payload[i].dateTime) <= query.endTime*1000) { length = length + 1; } } console.log("length", length); var result = new Array(length); for(let i = 0; i < length ; i++){ result[i] = new Array(2); result[i][0] = ""; result[i][1] = 0; } let valid = 0; for(let j = 0 ;j < payload.length ; j++ ){ if(parseInt(payload[j].dateTime) >= query.startTime*1000 && parseInt(payload[j].dateTime) <= query.endTime*1000) { result[valid][0] = payload[j].dateTime; result[valid][1] = payload[j].maxTemperature; valid = valid + 1; } } return result; }
配置一個HTTP返回節點,輸出Node.js節點處理后的數據。
單擊部署調試按鈕,部署并啟動服務。
單擊部署調試按鈕,輸入請求參數,調試服務。
三個服務均調試成功后,單擊頁面右上角的發布按鈕,發布服務。