要想通過物聯(lián)網(wǎng)平臺(tái)實(shí)現(xiàn)遠(yuǎn)程監(jiān)控設(shè)備,那么就要建立監(jiān)控端設(shè)備(比如手機(jī))和被監(jiān)控端設(shè)備的數(shù)據(jù)交互,在阿里云物聯(lián)網(wǎng)平臺(tái)完成這個(gè)交互功能的方法就是建立兩個(gè)設(shè)備之間的數(shù)據(jù)流轉(zhuǎn),對(duì)于設(shè)備要流轉(zhuǎn)的物模型數(shù)據(jù),阿里云網(wǎng)站上已經(jīng)有詳細(xì)的示例介紹,但是對(duì)于設(shè)備上下線狀態(tài)的數(shù)據(jù)流轉(zhuǎn),網(wǎng)站沒有進(jìn)行詳細(xì)說明,本人經(jīng)過摸索,整理成此文,予以記錄。
目錄
一、監(jiān)控端設(shè)備與被監(jiān)控端設(shè)備完成數(shù)據(jù)交互的過程
第一,在物聯(lián)網(wǎng)平臺(tái)創(chuàng)建虛擬設(shè)備
第二,將實(shí)際設(shè)備與虛擬設(shè)備連接
第三,設(shè)置數(shù)據(jù)流轉(zhuǎn)
二、設(shè)備狀態(tài)數(shù)據(jù)流轉(zhuǎn)的設(shè)置
?第一步、創(chuàng)建數(shù)據(jù)源
第二步、創(chuàng)建數(shù)據(jù)目的?
第三步、創(chuàng)建解析器并關(guān)聯(lián)啟動(dòng)
第四步,測(cè)試
?三、腳本程序的解釋
第一步、腳本示例,詳見腳本語法 (aliyun.com)
第二步、本例腳本
1、設(shè)備上下線狀態(tài)Topic
2、設(shè)備上下線流轉(zhuǎn)的數(shù)據(jù)格式
3、腳本代碼
一、監(jiān)控端設(shè)備與被監(jiān)控端設(shè)備完成數(shù)據(jù)交互的過程
第一,在物聯(lián)網(wǎng)平臺(tái)創(chuàng)建虛擬設(shè)備
在物聯(lián)網(wǎng)平臺(tái)建立實(shí)際設(shè)備(監(jiān)控設(shè)備和被監(jiān)控設(shè)備)相對(duì)應(yīng)的虛擬設(shè)備,獲得ProductKey、DeviceName、DeviceSecret三要素。此步屬于阿里云物聯(lián)網(wǎng)平臺(tái)基本操作,阿里云官方網(wǎng)站有詳細(xì)說明,可以參考:
創(chuàng)建產(chǎn)品 (aliyun.com)
單個(gè)創(chuàng)建設(shè)備 (aliyun.com)
批量創(chuàng)建設(shè)備 (aliyun.com)
第二,將實(shí)際設(shè)備與虛擬設(shè)備連接
在實(shí)際設(shè)備接入程序內(nèi)配置相應(yīng)的虛擬設(shè)備三要素,完成實(shí)際設(shè)備與物聯(lián)網(wǎng)平臺(tái)的連接,注意:虛擬設(shè)備和實(shí)際設(shè)備只能一對(duì)一連接。阿里云已經(jīng)有設(shè)備的接入程序例程,可以參考:
下載設(shè)備端SDK (aliyun.com)
第三,設(shè)置數(shù)據(jù)流轉(zhuǎn)
建立物聯(lián)網(wǎng)平臺(tái)內(nèi)虛擬設(shè)備的數(shù)據(jù)流轉(zhuǎn),完成被監(jiān)控實(shí)際設(shè)備數(shù)據(jù)上傳到Iot虛擬設(shè)備->被監(jiān)控虛擬設(shè)備數(shù)據(jù)流轉(zhuǎn)到監(jiān)控虛擬設(shè)備->監(jiān)控虛擬設(shè)備數(shù)據(jù)下發(fā)到監(jiān)控實(shí)際設(shè)備,完成實(shí)際設(shè)備之間的數(shù)據(jù)交互。
此步基本操作可以參考:
設(shè)置數(shù)據(jù)流轉(zhuǎn)解析器 (aliyun.com)
設(shè)置數(shù)據(jù)流轉(zhuǎn)解析器又分為3步:配置數(shù)據(jù)源、配置數(shù)據(jù)目的、編寫解析器腳本程序。這三步中編寫腳本程序難度最大,最為關(guān)鍵。阿里云官網(wǎng)上腳本示例都是以物模型數(shù)據(jù)上報(bào)為例的,可以參考:
腳本語法 (aliyun.com)
二、設(shè)備狀態(tài)數(shù)據(jù)流轉(zhuǎn)的設(shè)置
本文以被監(jiān)控設(shè)備狀態(tài)流轉(zhuǎn)到監(jiān)控設(shè)備為例,被監(jiān)控虛擬設(shè)備名稱:LZM1001,監(jiān)控虛擬設(shè)備名稱:LZM1002,這兩臺(tái)設(shè)備已經(jīng)在物聯(lián)網(wǎng)平臺(tái)創(chuàng)建,并且已經(jīng)與實(shí)際設(shè)備進(jìn)行了連接。另外注意,阿里云物聯(lián)網(wǎng)平臺(tái)數(shù)據(jù)流轉(zhuǎn)有新版和舊版,本文以新版為例。
數(shù)據(jù)流轉(zhuǎn)設(shè)置的入口:物聯(lián)網(wǎng)平臺(tái)->規(guī)則引擎->云產(chǎn)品流轉(zhuǎn)
?第一步、創(chuàng)建數(shù)據(jù)源
1、在云產(chǎn)品頁面,點(diǎn)“數(shù)據(jù)源”標(biāo)簽
2、點(diǎn)“創(chuàng)建數(shù)據(jù)源”按鈕,給新的數(shù)據(jù)流轉(zhuǎn)創(chuàng)建一個(gè)新的數(shù)據(jù)源,本例也就是被監(jiān)控設(shè)備與虛擬設(shè)備LZM1001相連接的上下線狀態(tài)
3、在數(shù)據(jù)源名稱欄內(nèi)取一個(gè)名字:本例取名為“設(shè)備LZM1001上下線狀態(tài)”?,數(shù)據(jù)源描述可先不填。
4、點(diǎn)“確定”按鈕,然后可以在數(shù)據(jù)源頁面看到新創(chuàng)建的這條數(shù)據(jù)源。
5、點(diǎn)數(shù)據(jù)源“設(shè)備LZM1001上下線狀態(tài)” 后邊操作的“查看”,進(jìn)入數(shù)據(jù)源詳情界面,此時(shí)界面內(nèi)還沒有數(shù)據(jù)源。
6、在數(shù)據(jù)源詳情界面,點(diǎn)“添加Topic”按鈕,彈出“添加Topic”對(duì)話框。
7、第一個(gè)下拉列表框是Topic類型,選擇“設(shè)備狀態(tài)變化通知”。
8、第二個(gè)下拉列表框是產(chǎn)品名稱,選擇LZM1001所屬的產(chǎn)品。
9、第三個(gè)是設(shè)備名稱,選擇“LZM1001”
10、然后點(diǎn)“確定”按鈕。
?此時(shí)可以看到數(shù)據(jù)源詳情里已經(jīng)有了一條數(shù)據(jù)源。
第二步、創(chuàng)建數(shù)據(jù)目的?
?
?1、點(diǎn)“數(shù)據(jù)目的”按鈕。
2、點(diǎn)“創(chuàng)建數(shù)據(jù)目的”按鈕,彈出“創(chuàng)建數(shù)據(jù)目的”對(duì)話框。
3、數(shù)據(jù)目的名稱欄內(nèi):本例取名“設(shè)備LZM1002接收上線線狀態(tài)”。
4、選擇操作下拉列表框選“發(fā)布到另一個(gè)Topic”。
5、產(chǎn)品下拉列表框選擇LZM1002所屬的產(chǎn)品。
6、點(diǎn)“確定”按鈕,完成創(chuàng)建。
此時(shí)可以看到數(shù)據(jù)目的頁面內(nèi),已經(jīng)有了這條新建的數(shù)據(jù)目的,注意:要記住這條數(shù)據(jù)目的ID為1017,一會(huì)編寫解析器腳本會(huì)用到。
第三步、創(chuàng)建解析器并關(guān)聯(lián)啟動(dòng)
1、點(diǎn)“解析器”標(biāo)簽,進(jìn)入創(chuàng)建解析器頁面。
2、點(diǎn)“創(chuàng)建解析器”按鈕,彈出“創(chuàng)建解析器”對(duì)話框。
3、解析器名稱欄,本例取名為“設(shè)備LZM1001狀態(tài)發(fā)送到LZM1002”。
4、點(diǎn)“確定”按鈕,完成創(chuàng)建。
?5、在創(chuàng)建解析器頁面可以看到這條新建的解析器,點(diǎn)操作欄“查看”,進(jìn)入解析器詳情頁面,對(duì)解析器進(jìn)行下一步操作。
6、在解析器詳情頁面點(diǎn)“數(shù)據(jù)源”標(biāo)簽,進(jìn)入“關(guān)聯(lián)數(shù)據(jù)源”頁面。
7、點(diǎn)“關(guān)聯(lián)數(shù)據(jù)源”按鈕。
8、在“關(guān)聯(lián)數(shù)據(jù)源”對(duì)話框,數(shù)據(jù)源下拉列表框內(nèi)選擇剛剛創(chuàng)建的數(shù)據(jù)源“設(shè)備LZM1001上下線狀態(tài)”。
9、然后點(diǎn)“確定”按鈕。
此時(shí)可以看到關(guān)聯(lián)數(shù)據(jù)源頁面內(nèi),已經(jīng)有了一條數(shù)據(jù)源。
10、點(diǎn)“數(shù)據(jù)目的”標(biāo)簽。
11、在“數(shù)據(jù)目的”頁面內(nèi),點(diǎn)“關(guān)聯(lián)數(shù)據(jù)目的”按鈕。
12、 在“關(guān)聯(lián)數(shù)據(jù)目的”對(duì)話框內(nèi),在數(shù)據(jù)目的選擇下拉列表框選擇剛剛創(chuàng)建的數(shù)據(jù)目的“設(shè)備LZM1002接收上線線狀態(tài)”。
13、點(diǎn)“確定”按鈕,完成關(guān)聯(lián)。
?此時(shí),在數(shù)據(jù)目的頁面,可以看到有了這條數(shù)據(jù)目的,數(shù)據(jù)目的ID為1017。
?14、點(diǎn)“解析器腳本”標(biāo)簽,進(jìn)入“編輯腳本”界面。
15、在編輯框內(nèi),輸入如下代碼:
var data = payload("json"); var select = {}; select.put("deviceName", deviceName()); select.put("timestamp", timestamp()); select.put("status", data.status); writeIotTopic(1017, "/sys/gbsp*******/LZM1002/thing/service/property/set", select);
16、點(diǎn)“保存”按鈕。
17、點(diǎn)“發(fā)布”按鈕。
18、點(diǎn)解析器“設(shè)備LZM1001狀態(tài)發(fā)送到LZM1002”前的后退箭頭,返回到“云產(chǎn)品流轉(zhuǎn)”頁面。
19、點(diǎn)擊“設(shè)備LZM1001狀態(tài)發(fā)送到LZM1002” 這條解析器后邊的“啟動(dòng)”按鈕,啟動(dòng)云產(chǎn)品流轉(zhuǎn)解析器。
第四步,測(cè)試
測(cè)試設(shè)備:LZM1001為一臺(tái)真實(shí)設(shè)備,LZM1002用Android studio AVD代替。進(jìn)行測(cè)試的結(jié)果如下:
當(dāng)設(shè)備LZM上線時(shí),LZM1002收到的消息中的msg即為數(shù)據(jù)流轉(zhuǎn)的內(nèi)容
devicename:LZM1001
timestamp:1661580931561
status:online
?當(dāng)設(shè)備LZM下線時(shí),LZM1002收到的消息中的msg即為數(shù)據(jù)流轉(zhuǎn)的內(nèi)容
devicename:LZM1001
timestamp:1661590108538
status:offline
?測(cè)試結(jié)果正確,配置成功!
?三、腳本程序的解釋
?下邊對(duì)腳本的代碼進(jìn)行一下解釋:
第一步、腳本示例,詳見腳本語法 (aliyun.com)
以下為阿里云上給出的腳本示例:
示例數(shù)據(jù)為上報(bào)的屬性數(shù)據(jù),輸入數(shù)據(jù)如下:
{ "deviceType": "CustomCategory", "iotId": "JCp9***", "requestId": "1626948228247", "checkFailedData": { }, "productKey": "a1o***", "gmtCreate": 1626948134445, "deviceName": "Device1", "items": { "Temperature": { "value": 38, "time": 1626948134319 }, "Humidity": { "value": 25, "time": 1626948134319 } } }
解析和處理數(shù)據(jù)的示例如下:
//通過payload函數(shù),獲取設(shè)備上報(bào)的消息內(nèi)容,并按照J(rèn)SON格式轉(zhuǎn)換。 var data = payload("json"); //篩選出上報(bào)的溫濕度值。 var h = getOrNull(data, "items", "Humidity", "value"); var t = data.items.Temperature.value; // 設(shè)置溫度值大于38時(shí)觸發(fā)規(guī)則,轉(zhuǎn)發(fā)數(shù)據(jù)到云數(shù)據(jù)庫RDS。 // RDS表結(jié)構(gòu)為id[自增主鍵]、deviceName、temperature、humidity、time,在writeRds方法中,可以按column:value的形式,將值寫入對(duì)應(yīng)的列。 if (t > 38) { writeRds(1000, {"deviceName":deviceName(), "temperature":t, "time":timestamp(), "humidity":h}); }
解析處理的數(shù)據(jù)源必須轉(zhuǎn)換為JSON格式數(shù)據(jù),即數(shù)組或者嵌套的JSON數(shù)據(jù)。
第二步、本例腳本
首先看一下設(shè)備狀態(tài)變化的Topic和數(shù)據(jù)格式,此部分內(nèi)容可以參考數(shù)據(jù)格式 (aliyun.com)
1、設(shè)備上下線狀態(tài)Topic
Topic:/as/mqtt/status/${productKey}/${deviceName}
通過該Topic獲取設(shè)備的上下線狀態(tài)。
此句用在數(shù)據(jù)源關(guān)聯(lián)。
2、設(shè)備上下線流轉(zhuǎn)的數(shù)據(jù)格式
設(shè)備上線的數(shù)據(jù)格式:
{ "status":"online", "iotId":"4z819VQHk6VSLmmBJfrf00107e****", "productKey":"al12345****", "deviceName":"deviceName1234", "time":"2018-08-31 15:32:28.205", "utcTime":"2018-08-31T07:32:28.205Z", "lastTime":"2018-08-31 15:32:28.195", "utcLastTime":"2018-08-31T07:32:28.195Z", "clientIp":"192.0.2.1" }
設(shè)備下線的數(shù)據(jù)格式:
{ "status":"offline", "iotId":"4z819VQHk6VSLmmBJfrf00107e****", "offlineReasonCode":427, "productKey":"al12345****", "deviceName":"deviceName1234", "time":"2018-08-31 15:32:28.205", "utcTime":"2018-08-31T07:32:28.205Z", "lastTime":"2018-08-31 15:32:28.195", "utcLastTime":"2018-08-31T07:32:28.195Z", "clientIp":"192.0.2.1" }
上下線的數(shù)據(jù)格式中,第1條即為上下線的status的鍵值對(duì)。
3、腳本代碼
var data = payload("json");
var select = {};
select.put("deviceName", deviceName());
select.put("timestamp", timestamp());
select.put("status", data.status);
writeIotTopic(1017, "/sys/gbsp*******/LZM1002/thing/service/property/set", select);
(1)第1行代碼:
var data = payload("json");
本例腳本代碼第一行與腳本示例第一句一致,將設(shè)備狀態(tài)變化通知上報(bào)的數(shù)據(jù)用payload函數(shù),轉(zhuǎn)成json格式,并將此json格式數(shù)據(jù)賦值給變量data。payload函數(shù)詳細(xì)解釋如下表:
payload(textEncoding) 返回設(shè)備發(fā)布消息payload的轉(zhuǎn)義數(shù)據(jù)。textEncoding表示payload的轉(zhuǎn)義字符編碼,取值如下:
- 不傳入?yún)?shù):默認(rèn)按照UTF-8編碼轉(zhuǎn)換為字符串,即
payload()
等價(jià)于payload('utf-8')
。'json'
:將payload數(shù)據(jù)轉(zhuǎn)換成Map格式變量。如果payload不是JSON格式,則返回異常。'binary'
:將payload數(shù)據(jù)轉(zhuǎn)換成二進(jìn)制變量進(jìn)行透?jìng)鳌?/li>
(2)第2行代碼:
?var select = {};
構(gòu)建一個(gè)名為select的map類型數(shù)據(jù),map內(nèi)存儲(chǔ)的對(duì)象為鍵值對(duì),第一列為鍵名,第二列為鍵值,select初始化為空。
(3)第3-6行代碼:
?select.put("deviceName", deviceName()); select.put("timestamp", timestamp()); select.put("status", data.status);
向select內(nèi)填加三個(gè)鍵值對(duì),分別為設(shè)備名deviceName、時(shí)間戳timestamp和狀態(tài)status。
注意鍵值名為一個(gè)標(biāo)志字段,帶雙引號(hào),其后的鍵值是從設(shè)備狀態(tài)變化時(shí)上傳的消息數(shù)據(jù)中取出的,所以為一個(gè)變量。
devieName和timestamp為設(shè)備上下線數(shù)據(jù)具體內(nèi)容json之外的部分,所以變量格式為函數(shù)形式:?deviceName()和timestamp()。
而status是json數(shù)據(jù)的具體內(nèi)容,所以格式為data.status,此處是關(guān)鍵!
- Map類型基本數(shù)據(jù)類型支持的函數(shù)。
表達(dá)式 說明 [Object] 獲取指定鍵( Key
)對(duì)應(yīng)的Value
。size() 獲取Map數(shù)據(jù)中鍵值對(duì)數(shù)量。 containKey(String) 判斷Map數(shù)據(jù)中是否包含指定的鍵。 keySet() 獲取Map數(shù)據(jù)中鍵的集合,返回類型為Array。 remove(Object) 移除Map數(shù)據(jù)中指定鍵對(duì)應(yīng)的鍵值對(duì)。 put(Object, Object) 在Map數(shù)據(jù)中添加鍵值對(duì)。 putAll(map) 在Map數(shù)據(jù)中批量添加一組Map數(shù)據(jù)。
?(4)第6行:
writeIotTopic(1017, "/sys/gbsp*******/LZM1002/thing/service/property/set", select);
?數(shù)據(jù)轉(zhuǎn)發(fā)到另外一個(gè)Topic,所用的函數(shù)為writeIotTopic,此第一個(gè)變量為數(shù)據(jù)目的ID(此ID一般為某個(gè)產(chǎn)品,而不是具體的設(shè)備),第二個(gè)變量為轉(zhuǎn)發(fā)目的的Topic(此變量確定為某個(gè)設(shè)備),第三個(gè)為轉(zhuǎn)發(fā)的map格式的數(shù)據(jù)。
本例中:數(shù)據(jù)目的ID為1017,就是上文創(chuàng)建的數(shù)據(jù)目的編號(hào)。
Topic包含了產(chǎn)品名稱:gbsp*******,設(shè)備名稱:LZM1002,以及下發(fā)格式:set
要發(fā)送的數(shù)據(jù)就是2-5行代碼創(chuàng)建的select。
writeIotTopic函數(shù)的具體說明如下:
writeIotTopic(destinationId, topic, payload, deviceName) | 流轉(zhuǎn)數(shù)據(jù)到另一個(gè)Topic。
開源MQTT托管形態(tài)的基礎(chǔ)型實(shí)例下,僅支持創(chuàng)建一個(gè)產(chǎn)品,默認(rèn)不支持跨產(chǎn)品流轉(zhuǎn)。文章來源:http://www.zghlxwxcb.cn/news/detail-800738.html |
數(shù)據(jù)轉(zhuǎn)發(fā)到另一Topic |
此段腳本中用的函數(shù)具體見:函數(shù)列表 (aliyun.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-800738.html
到了這里,關(guān)于阿里云物聯(lián)網(wǎng)Iot設(shè)備上下線狀態(tài)數(shù)據(jù)流轉(zhuǎn)的設(shè)置的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!