新聞中心
PRESS CENTER隨著物聯(lián)網技術的飛速發(fā)展,越來越多的設備連接到網絡,產生了海量的數據。在這種情況下,傳統(tǒng)的云計算中心模式已經無法滿足實時性、安全性等方面的需求。于是,邊緣計算應運而生,而邊緣網關作為邊緣計算的核心設備,正成為物聯(lián)網時代的關鍵樞紐。本文主要介紹邊緣計算網關EG8200采集Modbus RTU數據,通過MQTT協(xié)議連接阿里云物聯(lián)網平臺的過程,希望對讀者有所幫助。
下文默認已經采集到Modbus RTU數據。
網關配置:
第一步:采集Modbus RTU數據
第二步:安裝第三方阿里云節(jié)點
第三步:MQTT上報
第四步:下行寫Modbus RTU
平臺配置:
第一步:添加產品
第二步:添加設備
第三步:添加物模型
第四步:數據展示
第五步:下發(fā)寫數據演示
此處為采集Modbus RTU數據,不在過多贅述,可參考其他案例。
節(jié)點名稱:node-red-contrib-alibabacloud
點擊安裝后等待安裝成功(注意:網關需要成功連網絡才能安裝節(jié)點)
安裝成功后節(jié)點庫會出現(xiàn)剛才安裝的節(jié)點:
使用屬性上報
節(jié)點,參考平臺配置第三步的內容填寫MQTT鏈接信息:
設備名稱:阿里云三要素之一 deviceName
設備實例所在區(qū)域:cn-shanghai
productKey:阿里云三要素之一 productKey
deviceSecret:阿里云三要素之一 deviceSecret
第四步:下行寫Modbus RTU
使用屬性設置節(jié)點接收下行指令,使用函數節(jié)點將阿里云物聯(lián)網平臺下行的Json格式轉換為Modbus格式,queue節(jié)點限制數據的發(fā)送頻率(200ms一次,防止發(fā)送過快導致粘包),Modbus寫節(jié)點用于向從機寫入數據,演示請參考平臺配置第六步:
進入阿里云物聯(lián)網平臺:
設備管理->產品->創(chuàng)建產品
產品名稱:自定義
所屬類型:標準品類(根據自己實際使用類型來選擇)
節(jié)點類型:直連設備
聯(lián)網方式:蜂窩
數據格式:Alink JSON
其他默認:
設備管理->設備->添加設備:
產品:現(xiàn)在第一步創(chuàng)建的產品
DeviceName:自定義填入(這里使用網關SN)
備注名稱:自定義
設備管理->設備->查看:
將三要素填入阿里云屬性上報節(jié)點
,詳見網關配置第三步:
此時可以看到設備已經在線:
設備管理->產品->產看->功能定義
前往編輯草稿->添加自定義功能
功能名稱:自定義
標識符:數據上報的Key名相同
類型:根據自己的類型選擇
添加完成后點擊發(fā)布:
設備管理->設備->查看->物模型數據:
網關觸發(fā)數據發(fā)送,可以看到阿里云物聯(lián)網平臺物模型數據更新:
向兩個開關發(fā)送閉合指令,兩個發(fā)送頻率分別為50和60。從設備端可以看見節(jié)點返回了true即表示寫入成功,同時阿里云物聯(lián)網平臺監(jiān)控界面數據也同步發(fā)生變化:
本文介紹了一個相對復雜的流程,旨在表述網關所具備的能力,因此并未對程序的安全性、穩(wěn)定性、靈活性等方面做優(yōu)化。通過理解本流程,相信你已經對網關的可視化編程有了一定的熟悉。接下來,深入學習每個節(jié)點的功能用法吧,掌握它們將會為你制作更復雜的流程提供更多的選擇和可能!
網關的流程支持以Json格式導入導出,方便與其他人分享做好的流程。本章節(jié)的流程Json文件如下,復制后在菜單欄右上角選擇導入粘貼即可,導出同理
[{"id":"d968892da4e40a46","type":"inject","z":"7b370dcd7ad073da","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"5","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":520,"y":780,"wires":[["9b935c0dd6a63827","3bc2eb81af744a6d"]]},{"id":"9b935c0dd6a63827","type":"modbusRead","z":"7b370dcd7ad073da","name":"讀線圈","uid":"1","dataType":"1","modbus":"f4b98c3be57ddcad","columns":[{"Key":"MotorControl1","Address":"0","Type":"23","Tdata":""},{"Key":"MotorControl2","Address":"1","Type":"23","Tdata":""}],"x":670,"y":780,"wires":[["de1ce0dfa2e082f8"]]},{"id":"30fa1cad395c11c4","type":"modbusRead","z":"7b370dcd7ad073da","name":"讀頻率","uid":"1","dataType":"3","modbus":"f4b98c3be57ddcad","columns":[{"Key":"Requency1","Address":"0","Type":"1","Tdata":""},{"Key":"Requency2","Address":"1","Type":"1","Tdata":""}],"x":670,"y":860,"wires":[["de1ce0dfa2e082f8"]]},{"id":"de1ce0dfa2e082f8","type":"join","z":"7b370dcd7ad073da","name":"","mode":"custom","build":"merged","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"0.5","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":870,"y":820,"wires":[["95bd16daa8a2c276","2b0581f8ebdf6d1f"]]},{"id":"3bc2eb81af744a6d","type":"delay","z":"7b370dcd7ad073da","name":"","pauseType":"delay","timeout":"200","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":530,"y":860,"wires":[["30fa1cad395c11c4"]]},{"id":"95bd16daa8a2c276","type":"debug","z":"7b370dcd7ad073da","name":"調試 1","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1030,"y":820,"wires":[]},{"id":"9f85b7f4156038ba","type":"function","z":"7b370dcd7ad073da","name":"函數計算 1","func":"var sendObj = {\n uid: 1, //從機地址\n fc: 5,//功能碼寫多個線圈\n address: 0,//寄存器地址\n value:null \n}\n\nvar obj = msg.payload\nvar keyArray = Object.keys(obj.params)\n\nkeyArray.forEach((item)=>{\n if (item == \"MotorControl1\"){\n sendObj.address = 0\n sendObj.fc = 5\n sendObj.value = obj.params.MotorControl1\n node.send({ payload: sendObj})\n } else if (item == \"MotorControl2\"){\n sendObj.address = 1\n sendObj.fc = 5\n sendObj.value = obj.params.MotorControl2\n node.send({ payload: sendObj })\n } else if (item == \"Requency1\"){\n sendObj.address = 0\n sendObj.fc = 6\n sendObj.value = obj.params.Requency1\n node.send({ payload: sendObj })\n } else if (item == \"Requency2\") {\n sendObj.address = 1\n sendObj.fc = 6\n sendObj.value = obj.params.Requency2\n node.send({ payload: sendObj })\n }\n \n})\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":610,"y":960,"wires":[["ee218e37bc8a988d"]]},{"id":"dc772b2797c696fa","type":"modbusWrite","z":"7b370dcd7ad073da","name":"","model":"2","uid":"1","dataType":5,"address":"1","quantity":"1","modbus":"f4b98c3be57ddcad","x":910,"y":960,"wires":[["603fa8f8678db1a2"]]},{"id":"2b0581f8ebdf6d1f","type":"alibabacloud-property-post","z":"7b370dcd7ad073da","name":"","device":"2de325e2514d684b","x":960,"y":720,"wires":[]},{"id":"f1b50c093c9e1359","type":"alibabacloud-property-set","z":"7b370dcd7ad073da","name":"","device":"2de325e2514d684b","x":430,"y":960,"wires":[["9f85b7f4156038ba"]]},{"id":"ee218e37bc8a988d","type":"queue","z":"7b370dcd7ad073da","name":"","firstMessageBypass":false,"bypassInterval":"200","x":770,"y":960,"wires":[["dc772b2797c696fa"]]},{"id":"603fa8f8678db1a2","type":"debug","z":"7b370dcd7ad073da","name":"調試 2","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1070,"y":960,"wires":[]},{"id":"f4b98c3be57ddcad","type":"modbus config","name":"","model":"2","host":"127.0.0.1","port":"502","serialport":"/dev/ttyAS3","baudrate":"9600","databits":"8","stopbits":"1","parity":"none","timeout":"50","reqtimeout":"1000"},{"id":"2de325e2514d684b","type":"alibabacloud-device","device_name":"820000003058164F","region":"cn-shanghai"}]
MQTT配置節(jié)點導出時,不會攜帶用戶名和密碼。因此導入時需要重新錄入用戶名和密碼