新闻中心
PRESS CENTER随着物联网技术的飞速发展,越来越多的设备连接到网络,产生了海量的数据。在这种情况下,传统的云计算中心模式已经无法满足实时性、安全性等方面的需求。于是,边缘计算应运而生,而边缘网关作为边缘计算的核心设备,正成为物联网时代的关键枢纽。本文主要介绍边缘计算网关EG8200采集Modbus RTU数据,通过MQTT协议连接阿里云物联网平台的过程,希望对读者有所帮助。
下文默认已经采集到Modbus RTU数据。
网关配置:
第一步:采集Modbus RTU数据
第二步:安装第三方阿里云节点
第三步:MQTT上报
第四步:下行写Modbus RTU
平台配置:
第一步:添加产品
第二步:添加设备
第三步:添加物模型
第四步:数据展示
第五步:下发写数据演示
此处为采集Modbus RTU数据,不在过多赘述,可参考其他案例。
节点名称:node-red-contrib-alibabacloud
点击安装后等待安装成功(注意:网关需要成功连网络才能安装节点)
安装成功后节点库会出现刚才安装的节点:
使用属性上报
节点,参考平台配置第三步的内容填写MQTT链接信息:
设备名称:阿里云三要素之一 deviceName
设备实例所在区域:cn-shanghai
productKey:阿里云三要素之一 productKey
deviceSecret:阿里云三要素之一 deviceSecret
第四步:下行写Modbus RTU
使用属性设置节点接收下行指令,使用函数节点将阿里云物联网平台下行的Json格式转换为Modbus格式,queue节点限制数据的发送频率(200ms一次,防止发送过快导致粘包),Modbus写节点用于向从机写入数据,演示请参考平台配置第六步:
进入阿里云物联网平台:
设备管理->产品->创建产品
产品名称:自定义
所属类型:标准品类(根据自己实际使用类型来选择)
节点类型:直连设备
联网方式:蜂窝
数据格式:Alink JSON
其他默认:
设备管理->设备->添加设备:
产品:现在第一步创建的产品
DeviceName:自定义填入(这里使用网关SN)
备注名称:自定义
设备管理->设备->查看:
将三要素填入阿里云属性上报节点
,详见网关配置第三步:
此时可以看到设备已经在线:
设备管理->产品->产看->功能定义
前往编辑草稿->添加自定义功能
功能名称:自定义
标识符:数据上报的Key名相同
类型:根据自己的类型选择
添加完成后点击发布:
设备管理->设备->查看->物模型数据:
网关触发数据发送,可以看到阿里云物联网平台物模型数据更新:
向两个开关发送闭合指令,两个发送频率分别为50和60。从设备端可以看见节点返回了true即表示写入成功,同时阿里云物联网平台监控界面数据也同步发生变化:
本文介绍了一个相对复杂的流程,旨在表述网关所具备的能力,因此并未对程序的安全性、稳定性、灵活性等方面做优化。通过理解本流程,相信你已经对网关的可视化编程有了一定的熟悉。接下来,深入学习每个节点的功能用法吧,掌握它们将会为你制作更复杂的流程提供更多的选择和可能!
网关的流程支持以Json格式导入导出,方便与其他人分享做好的流程。本章节的流程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配置节点导出时,不会携带用户名和密码。因此导入时需要重新录入用户名和密码