☰
轻量级开源工业物联网平台UNIHH-IOT架构与实战解析
2026/10/15 16:09:42 网站建设 项目流程

1. 项目概述与核心设计思路

做工业物联网平台这件事,我前前后后接触了不少项目。从最开始给车间设备做数据采集,到后来搭建完整的产线监控系统,最头疼的问题往往不是设备本身,而是平台选型。市面上的物联网平台大致分两类:一类是云厂商的商业产品,功能全但重,部署起来要一堆依赖,小团队玩不转;另一类是各种开源框架,灵活但散,协议接入、数据存储、告警通知全都要自己拼。UNIHH-IOT这个项目,最吸引我的地方在于它把“轻量级”和“高性能”这两件事同时做到了,而且前后端代码全部开源,拿来就能改,不用被厂商绑死。

简单来说,UNIHH-IOT是一套面向工业场景的物联网平台,覆盖设备接入、数据采集、可视化展示、告警通知这几个核心环节。后端采用模块化设计,核心服务只保留设备管理、数据存储和规则引擎三块,其他功能全部通过插件扩展;前端基于主流框架重新封装了组件库,针对大屏展示和低带宽场景做了专项优化。项目定位很清晰,就是解决中小型工业现场数字化转型中“平台太重、成本太高、二次开发难”这三个痛点。

这套平台适合谁来用?我个人的判断是三类人:一是做产线数字化的集成商,需要一套可二次开发的基础平台;二是工厂内部的技术团队,想自己掌握数据平台而不是被商业产品绑架;三是个人开发者或学生,想深入理解物联网平台的核心机制,拿一个完整开源项目来学习。无论你属于哪一类,读完这篇文章应该都能对UNIHH-IOT的架构设计、部署流程和二次开发路径有个完整认识。

关于“轻量级”这个点,多说两句。很多平台号称轻量,实际部署起来数据库、消息队列、缓存、网关一个都不能少,光是把环境跑起来就要折腾一天。UNIHH-IOT在架构上做了减法,默认依赖只保留一个关系型数据库和一个可选的消息中间件,设备接入层甚至可以用内置的通信模块直连设备,不需要额外部署独立的接入网关。这意味着在一台4核8G的服务器上就能完整跑起来,对预算有限的小型项目非常友好。

2. 平台架构拆解:轻量级背后的设计逻辑

2.1 整体分层结构

UNIHH-IOT的整体架构可以分为四层:设备接入层、数据处理层、业务服务层和前端展示层。这四层的职责边界非常清晰,层与层之间通过标准的接口通信,替换任何一层都不会影响其他部分。

设备接入层负责跟硬件打交道,支持MQTT、Modbus TCP、Modbus RTU以及OPC UA等工业常见协议。这一层在设计上做得比较精巧的地方是把协议解析器做成了可插拔的SPI模式,新增协议不需要改动核心代码,只需要按接口规范实现一个解析器,打包后放到指定目录就能被自动加载。某工程师第一次做私有协议对接时,整个开发过程只花了两天,其中一天还是在跟硬件厂商对文档。

数据处理层是整个平台的核心价值所在。设备上报的数据先经过格式标准化,转成平台内部统一的物模型结构,然后进入规则引擎。规则引擎支持两类处理逻辑:一类是数据过滤和转换,比如把原始报文中的字节数组解析成可读的温度、压力值;另一类是告警触发,当数据满足特定条件时,自动生成告警记录并推送通知。处理完的数据会写入时序存储模块,默认支持按时间分区自动归档。

业务服务层主要管理设备生命周期、物模型定义和用户权限。设备从注册、上线、运行到停用,每一个状态变更都有对应的处理流程。物模型是UNIHH-IOT比较有特色的设计,它把设备抽象成“产品-设备”两级结构:产品定义属性、事件和服务,设备是产品的具体实例。这种设计在对接同类设备时非常高效,比如有10台型号相同的PLC,只需要维护一个产品模板,数据采集逻辑完全复用。

前端展示层提供了管理后台和可视化大屏两套界面。管理后台负责设备管理、数据查询和系统配置,可视化大屏用于产线实时监控。前端代码基于 Vue3 生态重构,组件全部按需加载,首次打开大屏页面的体积控制在1MB以内,在工业现场常用的老旧工控机上也能流畅运行。

2.2 为什么采用这样的技术路线

先聊后端。UNIHH-IOT 主语言选的是 Java 生态,基于 Spring Boot 框架构建。有人可能会问为什么不选 Node.js 或者 Go,从工业现场的实际需求来看,Java 的优势主要体现在稳定性和生态成熟度上。工业设备数据采集要求长时间不间断运行,Java 的成熟内存管理和丰富的监控工具,能够保证服务在无人值守的情况下稳定运行。同时,配合虚拟线程技术,单机并发能力也有了明显提升,实测某个项目中 500 台设备并发上报数据,CPU 占用率只到 25% 左右。

数据库选型上,核心业务数据使用了 MySQL,时序数据默认走内置的时序存储模块。这套组合看起来不像大数据架构那么“高级”,但胜在简单可靠,中小型项目完全够用。时序存储模块实质上是基于分区表做的优化封装,按时间自动建表、自动归档,查询时按时间范围路由到对应分区。这种方式在数据量不超过千万级的场景下,查询性能完全可以接受,而且运维成本极低,不用单独维护一套时序数据库集群。

前端选择 Vue3 加 TypeScript 的组合,图表采用 Canvas 方案而不是 SVG。这里有一个实际案例:在大屏页面渲染 2000 个节点的实时数据,Canvas 的渲染帧率稳定在 50 帧以上,SVG 则跌到了 20 多帧。工业监控页面通常数据点密集、变化频繁,渲染性能直接影响操作体验,Canvas 方案在这种场景下优势明显。

2.3 项目目录结构与代码组织

拿到开源代码后,建议先花点时间理解目录结构。UNIHH-IOT 采用 Maven 多模块工程,主要模块可以分为下面几个:

  • unihh-common:公共工具类、常量定义、统一返回结构
  • unihh-iot-core:核心服务,包括设备管理、物模型、规则引擎
  • unihh-iot-protocol:协议解析器接口和内置的 MQTT、Modbus 实现
  • unihh-iot-dataservice:数据处理与存储服务,负责标准化和时序存储
  • unihh-server:启动入口,包含装配逻辑和配置项
  • unihh-ui-admin:后台管理界面前端工程
  • unihh-ui-screen:可视化大屏前端工程

以协议接入为例,如果接到一个新设备类型,核心代码完全不需要修改,只需要在 unihh-iot-protocol 模块里新增一个协议解析器实现类,然后通过 @Service 注解注册即可。前端新增一个设备类型时,同样是在设备管理页面里配置产品的属性定义,不涉及代码改动。能做到这个程度,说明模块之间的边界划分是花了心思的,这也是我认为这个项目值得推荐的主要原因之一。

3. 核心机制详解:设备接入、物模型与规则引擎

3.1 物模型机制:平台的数据字典

物模型这个词听起来抽象,实际上理解起来不难。它定义了设备“是什么样”和“能做什么”,包括三个核心维度:

  • 属性:设备的状态数据,比如当前温度、湿度、设备开关状态。属性支持只读和可写两种模式,可写属性可以通过平台下发指令修改。
  • 事件:设备主动上报的信息,比如故障、告警、配置变更。事件携带的参数在物模型中预先定义好,平台按照定义解析和存储。
  • 服务:平台可以对设备下发的控制指令,比如“启动设备”“停止运行”“修改参数”。服务定义包括入参和出参,平台调用服务时自动生成指令报文下发到设备端。

举个例子,接入一个温控器设备,产品模型里定义属性“当前温度”、服务“设定目标温度”、事件“超温告警”。设备上线后,温度数据不断上报并存储在时序库中,当温度超过阈值时设备的告警事件被平台捕获,规则引擎根据预设逻辑触发通知。整套流程中,平台内部处理的数据结构是统一的,不同类型设备接入后都能用同一套逻辑管理。

3.2 多协议接入的实战配置

先看 MQTT 接入的配置方式。在 application.yml 里配置好 MQTT 服务端信息后,通过管理后台的“协议管理”页面注册一个 MQTT 接入通道。设备端连接到 MQTT Broker,按照约定好的 Topic 格式上报数据,比如主题/unihh/{productKey}/{deviceKey}/message,消息体是 JSON 格式,包含属性和事件数据。

平台端收到消息后通过 payload 中的 productKey 和 deviceKey 解析出对应的设备实例,然后按照该产品定义的物模型结构进行数据解析。有自定义需求的话,可以在协议解析器里改写解析逻辑,实现字段映射、单位转换、异常值过滤等操作。

Modbus 接入走的是另一套流程。平台内置了 Modbus TCP 主站功能,通过配置从站地址、寄存器地址和数据格式,轮询采集设备数据。这里有一个需要特别关注的点是寄存器地址的计算:假设某设备的温度寄存器地址是 40001,在配置时需要填写 0,因为 Modbus 的地址映射是从 0 开始的,40001 对应的实际偏移量是 0。这类细节问题非常容易踩坑,建议在配置前先确认设备文档中的地址描述方式。

3.3 规则引擎的应用与配置示例

规则引擎解决的是“数据到了之后要做什么”的问题。UNIHH-IOT 内置了一套轻量的规则机制,包含触发条件、执行动作两个部分。触发条件支持表达式匹配,比如temperature > 80 && deviceStatus == 1,执行动作支持告警生成、消息通知、服务调用等。

来看一个具体的规则配置示例,目标场景是:当设备离线超过 5 分钟时,给负责人发送通知。

首先在规则管理页面创建一个规则,规则名称填写“设备离线告警”,触发数据源选择“设备状态事件”。条件表达式配置为“设备在线状态等于离线”,时间窗口设为 5 分钟,即只有当离线状态持续 5 分钟才触发。动作选择“发送告警通知”,通知方式包括站内通知和邮件通知,接收人可在规则编排时指定。

这里需要注意,规则引擎按“事件驱动”方式运行,数据进入系统后先被标准化,然后与规则逐一匹配,匹配成功的规则才执行相应动作。规则按优先级排列,优先级高的先执行,避免多个规则同时触发时产生冲突。在某次实际项目中,同一台设备同时触发了“高温告警”和“数据异常”两条规则,由于预先设置了优先级,最终只执行了“高温告警”动作,避免了重复通知造成的干扰。

4. 快速部署与二次开发实操

4.1 环境依赖与准备工作

正式部署前需要准备以下环境:

  • JDK 17 或更高版本
  • MySQL 8.0 及以上版本
  • Maven 3.8 以上版本
  • Node.js 16 以上版本,用于构建前端工程
  • 一台推荐配置为 4核8G 的 Linux 服务器

UNIHH-IOT 提供了 Docker Compose 部署方式,一键启动所有依赖组件。不愿意用 Docker 的话也完全可以手动部署,核心服务打包后是一个独立的 Spring Boot Jar 包,命令简单直接:

java -Xms1g -Xmx2g -jar unihh-server.jar --spring.profiles.active=prod

参数说明:-Xms1g指定 JVM 初始堆内存为 1GB,-Xmx2g指定最大堆内存为 2GB,这个配置在我测试的多个项目中都比较稳定。如果设备量特别大,可以适当调高-Xmx,建议按设备数乘以 4MB 来估算。

4.2 部署过程中的关键配置项

数据库初始化是最容易卡住新手的地方。项目启动前需要先创建数据库实例,然后执行项目根目录下sql/init.sql脚本,脚本中有修改默认密码的提示,务必把默认密码换掉再做后续操作。

数据库连接相关配置在application-prod.yml中,主要关注下面几个参数:

spring: datasource: url: jdbc:mysql://localhost:3306/unihh_iot?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: unihh password: 你的生产环境密码

这里有一个我踩过的坑:服务器时区设置不对导致时间字段错乱。建议在数据库连接串中显式加上serverTimezone=Asia/Shanghai,同时确认服务器本身的系统时区也是上海时区,不然后续所有的时间统计报表都会偏差 8 个小时。

前端构建相对简单:

cd unihh-ui-admin npm install npm run build

构建产物在dist目录下,通过 Nginx 部署。需要注意 Nginx 的反向代理配置,把/api路径的请求转发到后端服务的 8080 端口。如果配置不对,会出现“前端页面正常打开,但登录接口一直报 404”的情况。

4.3 一个最小的设备接入示例

部署完成后,接下来用一个最小示例走通“设备-平台”的数据通路。创建一个模拟设备,通过 MQTT 协议上报温度数据,然后在平台大屏上看到实时刷新。这是我每次验证环境是否正常都执行一遍的操作,耗时不到 10 分钟,但能一次性验证接入层、存储层和展示层的整体链路。

步骤一:在管理后台创建产品。产品名称填“模拟温控器”,接入协议选 MQTT。创建完成后拿到 productKey。

步骤二:在产品下注册设备。设备名称填“车间一号温控”,设备标识填 device-001,平台自动生成设备密钥。

步骤三:设备端连接 MQTT Broker,上报数据。用命令行工具模拟设备上报:

mosquitto_pub -h localhost -p 1883 -t "/unihh/{productKey}/device-001/message" -m '{"type":"property","data":{"temperature":26.5}}'

把{productKey}替换成实际的产品密钥,执行后到平台的设备详情页面查看“最新数据”,如果能看到温度值为 26.5,同时时间戳是当前时间,说明整个链路已经通了。

4.4 新增私有协议的接入流程

接私有协议是工业项目中需求量比较大的场景。平台提供了标准接口,按下面几步操作就能扩展一个新协议:

第一步,在unihh-iot-protocol模块下新建一个协议解析器的实现类,实现接口中定义的连接设备、解析数据、下发指令这三个核心方法。

第二步,在类上添加@Service("customProtocol")注解,这个名称将作为协议标识在后台配置中使用。

第三步,把项目重新打包,把新增的 Jar 包放到外部扩展目录,重启服务后即可在后台看到新的协议选项。

4.5 前端大屏的自定制要点

大屏定制是用户最常提出的需求之一,好在 UNIHH-IOT 的前端代码组件化程度较高,不需要从零开发。大屏工程里封装了基础图表组件,使用方式与普通组件基本一致。配置过程中有几个常见的注意事项:

第一个是关于数据刷新频率。实时大屏默认每秒刷新一次,如果设备量很大,建议把刷新间隔调整为 3 到 5 秒。不是所有数据都需要秒级刷新,产线最终要看的还是宏观趋势,高频刷新在高设备量场景下反而容易造成前端卡顿。

第二个是布局适配问题。大屏通常运行在不同分辨率的屏幕上,组件需要自适应缩放。项目中已有的自适应方案是按设计稿比例整体缩放,实测在 1920x1080 和 3840x2160 两种分辨率下都能正常显示,但如果屏幕比例不是 16:9,会出现底部内容超出可视区域的问题,需要根据实际场景调整设计稿尺寸。

第三个是颜色规范。工业监控大屏一般以深色背景为底,图表配色需要与背景形成对比。项目中整理了统一的主题色变量文件,修改全局配色只需要在variables.scss中调整几个变量值,不需要逐个组件改动。

5. 实践中的性能调优与运维经验

5.1 接入层性能优化

设备接入层的性能瓶颈通常出现在两个方面:一是连接数的开销,二是消息处理的吞吐量。UNIHH-IOT 内置的接入层支持连接复用,多个设备可以共享同一条长连接上报数据,有效减少了系统同时维护的连接数。实测在开启连接复用后,单台服务器能够稳定支撑 500 台设备并发接入。

如果设备数量继续增长,建议优先检查下面几个参数:

  • MQTT 客户端的并发线程数是否足够,线程数建议配置为 CPU 核心数的两倍左右。
  • 连接保活时间设置是否合理,过长会导致无效连接堆积,过短会给设备端带来不必要的重连压力。
  • 数据处理链路中是否有多余的序列化和反序列化操作,可以优化掉不必要的类型转换。

5.2 数据存储层的优化策略

存储层的优化重点在于时序数据的管理和查询。平台默认对时序数据按天分区,数据量较大的场景可以把分区粒度降低到小时级,查询时就能精确定位到目标分区,减少无效扫描。

归档低频访问的数据是另一个实用手段。几个月前的原始数据通常不会频繁查询,可以定期转移到冷存储。平台提供了数据清理任务的定义方式,支持按时间范围自动删除或转存。在做清理配置时,需要注意保留策略:如果存在需要长期追溯的业务场景,简单的清理策略可能并不适用,建议先做数据归档再做清理。某工厂设备保养记录需要保留一年,配置时会先把低频数据转为归档文件,再从主存储中删除,既保证了查询性能,也满足审计要求。

查询慢还有一个常见原因是索引未生效。在按设备和时间范围查询时,建议检查一下表中是否针对设备标识和时间列建了联合索引。没建索引之前,查询耗时动辄几秒,建了之后一般能压到 200 毫秒以内,效果非常明显。

5.3 安全加固建议

开源平台部署到生产环境,安全加固这步省不了,安全并不是一个可有可无的选项。

首先是默认密码。部署完成后第一件事,把系统默认的账号密码全部换掉。我在测试环境见过不少部署完原封不动接着跑的情况,一旦暴露到公网,等于把设备控制和数据直接开放给了所有人。其次是开放端口最小化,只对外开放必要的业务端口和管理入口,其他内部端口一律限制来源地址。最后是使用加密协议传输设备数据,设备与平台之间的通信建议启用 TLS 加密,避免数据在传输过程中被截获。

5.4 监控与日志排查

日常运维中,平台日志建议至少开启 INFO 级别,排障阶段可以临时调整到 DEBUG 级别。日志文件中重点关注几类信息:

  • 设备上下线日志:记录每个设备的连接和断开事件,排查设备频繁掉线问题的主要依据。
  • 消息解析失败日志:出现这类记录需要核对协议配置是否正确、设备上报的数据格式是否符合物模型定义。
  • 规则引擎执行日志:记录规则触发和动作执行的详细过程,排查告警不生效问题时重点查看。
  • 数据库慢查询日志:定位数据查询的性能瓶颈,对频繁执行的慢语句考虑优化索引或改写查询逻辑。

6. 常见问题与排查技巧记录

6.1 设备频繁掉线

这个问题多与参数配置和设备侧网络环境有关。排查时可以按这条路径走:

第一步,查看设备上下线日志,如果日志中反复出现“连接断开”和“重新连接”的记录,优先检查 MQTT 保活时间参数,设备端设置的保活时间比平台设定的时间短,设备在平台判活之前就主动断开了。第二步,检查设备所在网络的稳定性,无线传输场景下信号波动很容易导致连接闪断。第三步,切换到有所调整的连接参数后测试持续运行时间,一般只要线路稳定、参数匹配,掉线率能明显降下来。

6.2 数据上报有延迟

数据延迟在低并发场景下通常不是平台本身的问题,而是从设备数据产生到平台处理完成这个链条上的延迟。先确认设备采集上报频率是否设置合理,再检查设备端到平台之间的网络链路,特别是跨地域部署时 RTT 对实时性的影响。平台侧可以关注消息处理的线程池设置,如果上报频率大于处理速度,队列会堆积,数据自然越积越慢。开启批量数据合并处理也能有效降低单条数据的处理开销。

6.3 告警不触发

告警配置完成后不生效,大多数情况是触发条件或数据链路的问题。检查顺序建议为:

第一步,确认规则是否已经启用,有遇到规则保存成功但状态是“停用”的情况。 第二步,确认触发条件里的指标名称是否与物模型定义的属性名称一致,一个字母不相符就无法匹配。 第三步,确认条件表达式逻辑是否正确。规则配置页面里的“模拟调试”按钮,可以模拟一条测试数据来判断规则是否正常触发,排查起来非常实用。

6.4 前端页面资源加载缓慢

资源加载慢通常出现在首次访问大屏页面时。确认构建产物是否启用了代码压缩,组件是否按需加载。从实际经验看,最常见的原因是静态资源没有走 CDN,服务器带宽又比较小,导致一次性拉取大量资源时耗时较久。把静态资源托管到 CDN 或独立静态服务,能明显提升页面加载速度。

6.5 常用问题速查表

问题现象可能原因处理建议
设备无法上线MQTT 认证失败检查设备密钥是否填写正确
设备上线后无数据Topic 格式不匹配与平台端要求的 Topic 格式核对
数据采集不完整寄存器地址配置偏移错误确认文档中的地址映射规则
告警未触发规则未启用或条件不匹配核对规则状态和表达式
登录页面打不开Nginx 反向代理配置错误检查/api转发规则是否生效
数据库连接失败时区配置不对或账号受限在连接池中显式配置时区

7. 从开源到落地:团队协作与项目演进

7.1 开源项目引入团队的正确方式

把 UNIHH-IOT 引入团队,第一步不是直接让开发改代码,而是先建立内部的知识传递机制。建议安排一到两周的时间,让核心开发把平台架构、物模型设计、规则引擎机制这些关键概念给团队成员讲清楚,配合部署环境提供练习实例。我在一个实际项目的推行过程中遇到过这样的情况:前端同学还是按照原有的界面开发习惯,直接把大屏设计稿套上去,没有理解平台已有的组件封装,导致大量代码返工。先统一认知再做开发,效率反而更高。

7.2 二次开发中保持可维护性的建议

团队基于开源平台做二次开发,最担心的是分支越改越乱,后续官方升级无法拉取更新。几个规避建议:

存在多个项目并行的情况时,尽量把通用能力沉淀到公共模块中,项目专属逻辑放到业务模块中。配置文件按环境拆分,不共享敏感信息。保持与官方主线的版本追踪机制,定期把官方更新合并到内部主分支,降低后期升级的成本。

7.3 基于 UNIHH-IOT 扩展更多应用场景

平台基础能力稳定后,扩展空间其实很大。我见到的比较有代表性的场景有两种:

第一种是把平台接到能源管理系统,采集产线的水电气数据,实现能耗分项计量。这类项目的数据量不大,但报表按部门、按产线汇总统计的维度比较细,对物模型的灵活性要求比较高。UNIHH-IOT 的产品级功能配置方式支持直接创建“能源表计”产品,然后按分项逻辑做汇总查询。

第二种是做设备预测性维护。通过在规则引擎里增加设备运行指标的特征值分析,当设备数据曲线与历史故障模式相似时触发预警。这种方式需要有一定量的历史数据做支撑,建议先跑上两三个月的纯数据采集,积累足够样本后引入故障判别规则,准确率会明显提升。

7.4 社区维护与代码共建

开源项目是社区一起养起来的,UNIHH-IOT 也不例外。使用过程中发现的 bug 可以提 issue,附上完整的复现步骤、日志和运行环境描述,维护者处理起来效率会高很多。提交代码时写清楚改动原因和影响范围,让评审者能快速理解改动意图。工业物联网的社区本身不大,技术人的互相支持能让项目走得更远。

8. 个人的几点实操心得

前前后后在几个实际项目里用过这套平台,最大的感受是“轻量级”确实是它的核心价值。从部署到业务跑通,一个小团队基本两到三周就能完成,这个速度在传统物联网平台上是很难做到的。特别适合工业企业内部信息化团队作为数字化的起步基座。

几个想分享的具体体会:

第一,数据库设计在项目开始前一定要做充分评审,尤其是设备表、物模型表的结构设计。中间改造过一轮数据库,数据迁移的过程远比想象中麻烦。

第二,协议接入的插件机制确实好用,但扩展协议前先把协议文档完整看一遍。很多协议在文档里描述得含糊,实际调试时才发现还有隐藏的字节序和校验位要求。预留足够时间读文档、抓包、做模拟验证,是减少返工的有效手段。

第三,规则引擎是平台的核心能力,但规则逻辑要克制。不要试图在一个规则里塞太多条件,规则拆得细一些,后续维护会轻松很多。配置规则时养成写备注的习惯,时间久了回来看也记得当初的配置意图。

最后再分享一个小技巧:刚开始不要追求一步到位,先用少量设备走通全链路,再逐步扩展。很多团队一开始就想着把几百台设备全部接入,结果问题排查困难、推进缓慢。先用一两台设备打通端到端流程,验证稳定后再逐步增加设备数,这样整个过程会顺畅得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询