去年有实现一个智能喷淋系统,编写了一个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,马上生效。

然后在子设备的“属性”和“数据”页,即可看到采集到的数据。

控制设备

子设备“开关控制器”,进入“服务页面”

点击执行即可下发控制指令。


作者:大石头 发布:2022-06-21 14:18:50 浏览:3,671)