去年有实现一个智能喷淋系统,编写了一个NET6应用,部署在A2工业计算机里面,基于传感器采集数据与定时控制,实现自动浇花功能。传送门 《[NET-IOT]智能喷淋系统》
现在我们有了成熟稳定的IoT平台,可以基于该平台搭建(无需定制编程)一套远程控制浇花的系统。
先看最终效果:《物联网管理平台》
这是IoT平台商用版的演示,我们把家里浇花系统接入,上图就是光照传感器的数据(经过LTTB降采样)。
IoT平台商用版是收费产品,出售源码及所有设计资料,包括IoTServer/IoTWeb/IoTData/IoTClient四大部分。需要在服务器端部署好前三个系统,IoTClient将部署到A2工业计算机里面。IoT平台支持集群部署,以支持海量设备接入,实测单机支持10万设备接入,每5分钟处理1000万点位数据。
IoTEdge边缘网关也是商用产品,附带在A2工业计算机里面一起销售。合作伙伴可获取IoTEdge源代码及设计资料。IoTEdge本质上是IoTServer+IoTWeb+IoTClient的集成精简版,仅单机使用,配置设备、采集存储数据、查看数据、控制设备等,都放在一起。
这里为了方便把数据在公网上展示,使用IoT平台。如果不需要对外公开数据,直接使用IoTEdge也可以。
部署IoTClient
使用工具MobaXterm连接A2工业计算机,默认 root/feifan,详细请看《A2工业计算机》。
在用户根目录 /root/ 下新建 iotclient目录,(部分机型的根目录是/home/feifan/),上传IoT平台源码中IoTClient发布出来的内容,主要包括DLL文件和Json文件。如下:
请IoTClient应用了nuget包 NewLife.ModbusRTU,因为我们的A2需要通过RS485接口对接各种传感器和控制器,走ModbusRTU协议。发布配置为Linux-ARM,输出目录将包括 NewLife.ModbusRTU.dll、System.IO.Ports.dll、libSystem.IO.Ports.Native.so。
命令 dotnet IoTClient.dll 启动一下应用,然后 ctrl+C 结束,为了让它生成Config目录。修改配置文件 Config/IoTClient.config,填写设备密钥、产品密钥和服务器地址。
<?xml version="1.0" encoding="utf-8"?> <IoTClient> <!--服务端地址。IoT服务平台地址--> <Server>http://iot.feifan.link:1881</Server> <!--设备证书。在一机一密时手工填写,一型一密时自动下发--> <DeviceCode></DeviceCode> <!--设备密钥。在一机一密时手工填写,一型一密时自动下发--> <DeviceSecret></DeviceSecret> <!--产品证书。用于一型一密验证,对一机一密无效--> <ProductKey>EdgeGateway</ProductKey> <!--产品密钥。用于一型一密验证,对一机一密无效--> <ProductSecret>EdgeGateway</ProductSecret> <!--聚合设备数。设备总数超过该设置时,多设备数据凑批上传--> <MergeDevices>4</MergeDevices> </IoTClient>
这里的服务端地址 http://iot.feifan.link:1881 指向IoTServer。产品密钥 EdgeGateway/EdgeGateway 对应IoTWeb里面看到的产品。
设备证书不填写时,首次登录会自动注册一个,因为产品打开了“动态注册”开关。
守护IoTClient
我们需要在A2启动时,自动启动IoTClient,让其进入工作状态。这里借助星尘代理 StarAgent,参考 《[StarAgent]星尘代理守护应用》
A2的StarAgent,位于/root/agent/,修改其下的Config/StarAgent.config,新增一个ServiceInfo
<ServiceInfo Name="iotclient" FileName="dotnet" Arguments="IoTClient.dll" WorkingDirectory="/home/feifan/iotclient/" AutoStart="true" AutoStop="false" ReloadOnChange="true" />
最终是这样
<?xml version="1.0" encoding="utf-8"?> <StarAgent> <!--调试开关。默认true--> <Debug>true</Debug> <!--证书--> <Code></Code> <!--密钥--> <Secret></Secret> <!--本地端口。默认5500--> <LocalPort>5500</LocalPort> <!--更新通道。默认Release--> <Channel>Release</Channel> <!--延迟时间。重启进程或服务的延迟时间,默认3000ms--> <Delay>3000</Delay> <!--应用服务集合--> <Services> <ServiceInfo Name="flower" FileName="GirlFlower" Arguments="" WorkingDirectory="/home/feifan/flower/" AutoStart="false" AutoStop="false" ReloadOnChange="false" /> <ServiceInfo Name="iotclient" FileName="dotnet" Arguments="IoTClient.dll" WorkingDirectory="/home/feifan/iotclient/" AutoStart="true" AutoStop="false" ReloadOnChange="true" /> </Services> </StarAgent>
配置设备
IoTClient启动后,会自动在平台注册一个设备
新增子设备
进入“子设备”,新增结果子设备,注意各自产品类型。
配置通道参数
进入子设备编辑页面,配置通道参数。
温湿度传感器连接在串口2上,对应/dev/ttyAMA1,波特率9600。这些参数在A2手册可以获得。
光照传感器
开关控制器
配置产品点位
来到IoT管理平台(IoTWeb),需要配置几个产品的点位信息,浇花系统一共有6个传感器,这里选其中三个作为代表,讲解如何配置。
IoT平台属于大型IoT平台系统,支持两级设备管理,分为网关主设备和传感子设备。
边缘网关这个产品作为主设备,它本身没有采集任务,协议选择“无”。
温湿度传感器、开关控制器、光照传感器属于传感子设备,协议都是ModbusRTU,因为它们都是RS485接入,走Modbus协议。
温湿度传感器
进入温湿度传感器的功能定义
它有5个真实的属性点位,最后面的cj属于虚拟点位。
看温度属性,关键性设置有类型、长度、点位地址和解析规则。
类型比较好理解,长度说的是字节数,Modbus里面一个寄存器是2个字节,点位地址是Modbus地址。为了能够很好的解析点位数据,我们这里使用了解析规则。如果是简单规则,可以使用交换16、交换32、缩放因子和常量因子。传感器温度说明书是,读取值除以10再减去40,因此有解析表达式,同时也可以使用缩放因子和常量因子来实现。
看湿度属性,它的点位地址是0,使用了缩放因子而不是表达式。
传感器说明书指示,湿度位于开头,地址0,读取值除以10即可,因此缩放因子是0.1。
光照传感器
光照传感器只有一个点位
这里使用了解析表达式,用交换16也可以。
开关控制器
开关控制器里配置了4个属性点位和1个功能服务
布尔类型属性,借助解析表达式
设备服务的定义,要简单一些
这里只是约定了开关控制的入参,可以用点位名称name,或者点位地址address,数据data就是0或者1
功能发布
功能定义配置完成以后,需要做功能发布,把物模型发布到每个设备中去。
到温湿度子设备中查看属性
采集数据
一切配置完成以后,等待几分钟,配置数据自动下发。
如果着急,可以重启IoTClient,马上生效。
然后在子设备的“属性”和“数据”页,即可看到采集到的数据。
控制设备
子设备“开关控制器”,进入“服务页面”
点击执行即可下发控制指令。