功能开启
进度说明:
- 管理后台,请使用 https://gitee.com/yudaocode/yudao-ui-admin-vue3 (opens new window) 仓库的
master分支 - 后端项目,请使用 https://gitee.com/zhijiantianya/ruoyi-vue-pro (opens new window) 仓库的
master(JDK8)、master-jdk17(JDK17/21)或master-jdk25(JDK25)分支
IoT 系统(对标 阿里云物联网 (opens new window)),后端由 yudao-module-iot 模块实现,前端由 yudao-ui-admin-vue3 的 iot 目录实现。
考虑到编译速度,默认 yudao-module-iot 模块是关闭的,需要手动开启。步骤如下:
- 第一步,开启
yudao-module-iot模块 - 第二步,导入 IoT 系统的 SQL 数据库脚本
- 第三步,搭建时序数据库(TDengine 或 IoTDB,二选一)
- 第四步,重启后端项目,确认功能是否生效
# 1. 第一步,开启模块
① 修改根目录的 pom.xml (opens new window) 文件,取消 yudao-module-iot 模块的注释。如下图所示:

② 修改 yudao-server 目录的 pom.xml (opens new window) 文件,引入 yudao-module-iot 模块。如下图所示:

③ 点击 IDEA 右上角的【Reload All Maven Projects】,刷新 Maven 依赖。如下图所示:

# 2. 第二步,导入 SQL
① 点击 iot-2026-02-10.sql.zip (opens new window) 下载附件,解压出 SQL 文件,然后导入到数据库中。
所有表名字,都使用 iot_ 作为前缀。
友情提示:↑↑↑ iot.sql 是可以点击下载的! ↑↑↑
重要说明:该 SQL 仅芋道星球成员可使用和商用,否则视为侵权(索赔 100 万,永久追溯)【下载即视为同意】。
② 参考 《定时任务》 (opens new window) 文档,只需要将 Quartz 定时任务的 quartz.sql 导入到数据库中即可(其它不用做)。【场景联动需要 Quartz 定时任务】
# 3. 第三步,搭建时序数据库
IoT 的「设备属性历史」「设备消息日志」存储在时序数据库中,支持 TDengine(默认)、IoTDB 两种。由 yudao-server 的 application.yaml 中的 yudao.iot.storage.type 配置项统一选择,两类数据始终存储在同一个时序库,不能分别选择。如下所示:
yudao:
iot:
storage:
type: tdengine # 时序存储的类型:tdengine、iotdb,需要配置同名的 spring.datasource.dynamic.datasource 数据源
友情提示:
- 只支持
tdengine、iotdb两个值,不支持通过该配置把属性历史、消息日志存到 MySQL 等关系型数据库。写错值时,项目启动失败。 - IoT 产品、设备、物模型等业务数据,仍然存储在原有的关系型数据库(第二步导入的 SQL),不会存到时序库。
- 只需要配置所选类型的同名数据源(
tdengine或iotdb),原有的master业务库等数据源配置保持不变。
# 3.1 方案一:TDengine
默认方案,yudao.iot.storage.type 保持 tdengine 即可。
① 参考 《用 Docker 快速体验 TDengine》 (opens new window) 文档,快速搭建 TDengine 时序数据库。命令如下:
docker run -d \
--name tdengine-test \
-p 6030:6030 \
-p 6041:6041 \
-p 6043:6043 \
-p 6044-6049:6044-6049 \
-p 6044-6045:6044-6045/udp \
-p 6060:6060 \
tdengine/tdengine
② 在 TDengine 中,创建 ruoyi_vue_pro 数据库。命令如下:
## 进入容器
docker exec -it tdengine-test /bin/bash
## 在容器内,使用 taos 命令行工具创建数据库:
taos
## 进入 TDengine CLI 后,执行以下 SQL 命令创建数据库:
CREATE DATABASE ruoyi_vue_pro;
默认的账号是 root,密码是 taosdata。
③ 修改项目的 application-local.yaml 配置文件,取消 spring.datasource.dynamic.datasource.tdengine 数据源的注释,配置 TDengine 数据库。如下图所示:

# 3.2 方案二:IoTDB
使用 IoTDB 2.0.x 的表模型(已使用 2.0.11 服务端验证)。项目已内置 iotdb-jdbc 2.0.8 驱动,无需随服务端升级驱动,也无需额外引入连接池依赖。
① 参考 《IoTDB Docker 部署》 (opens new window) 文档,快速搭建 IoTDB 单机版。命令如下:
docker run -d \
--name iotdb \
-p 6667:6667 \
-e timestamp_precision=ms \
-e enable_partial_insert=false \
-v $(pwd)/iotdb/data:/iotdb/data \
-v $(pwd)/iotdb/logs:/iotdb/logs \
apache/iotdb:2.0.11-standalone
项目要求 IoTDB 满足以下两项配置。镜像每次启动时,会把 -e 传入的同名环境变量写入容器内的 /iotdb/conf/iotdb-system.properties 配置文件:
timestamp_precision=ms:时间精度为毫秒(默认值)。只能在首次启动前设置,已经按其它精度启动过的实例(数据目录),不能再修改,需要使用新的 ms 精度实例。enable_partial_insert=false:关闭部分写入(默认为true),避免一行中部分列写入失败时,其它列仍然写入。集群部署时,所有 DataNode 都需要设置,修改后重启生效。
非 Docker 部署时,直接修改 IoTDB 安装目录下的 conf/iotdb-system.properties 即可,可见 《IoTDB 配置参数》 (opens new window) 文档。
② 在 IoTDB 中,创建 ruoyi_vue_pro 数据库。命令如下:
## 进入容器
docker exec -it iotdb /bin/bash
## 在容器内,使用表模型(-sql_dialect table)进入 IoTDB CLI:
/iotdb/sbin/start-cli.sh -sql_dialect table
## 进入 IoTDB CLI 后,执行以下 SQL 命令创建数据库:
CREATE DATABASE ruoyi_vue_pro;
默认的账号是 root,密码是 root。数据库名可以按需修改,但必须预先创建,并和下文 JDBC URL 中的库名保持一致。
③ 在 IoTDB CLI 中,执行以下只读语句,确认满足项目要求(项目启动时,也会使用对应账号做同样的检查,所以该账号需要能读取这些信息):
SHOW VARIABLES;
SHOW DATANODES;
SHOW ALL CONFIGURATION ON 1;
SHOW VARIABLES:TimestampPrecision为msSHOW DATANODES:所有 DataNode 的Status都为RunningSHOW ALL CONFIGURATION ON <nodeId>:enable_partial_insert为false。<nodeId>替换为SHOW DATANODES返回的NodeID(单机版一般为1),每个 DataNode 都需要检查
④ 修改项目的 application-local.yaml 配置文件,取消 spring.datasource.dynamic.datasource.iotdb 数据源的注释(与 master 平级),并将 yudao.iot.storage.type 修改为 iotdb。如下所示:
spring:
datasource:
dynamic:
datasource:
# master 等原有数据源,保持不变
iotdb: # IoT 数据库(需要 IoT 物联网,且 yudao.iot.storage.type 为 iotdb 再开启噢!)
lazy: true # 开启懒加载,保证启动速度
type: com.zaxxer.hikari.HikariDataSource # IoTDB 不使用 Druid 连接池
url: jdbc:iotdb://127.0.0.1:6667/ruoyi_vue_pro?sql_dialect=table # 表模型;数据库需要预先创建,且时间精度为 ms
driver-class-name: org.apache.iotdb.jdbc.IoTDBDriver
username: root
password: root
hikari:
maximum-pool-size: 8
connection-test-query: SELECT 1 # IoTDB 数据源的有效性检查 SQL
yudao:
iot:
storage:
type: iotdb # 默认在 application.yaml 中,也可以在这里覆盖
其中,url 中的 ruoyi_vue_pro 即连接的数据库,按实际库名修改即可,项目运行时不会切换数据库;sql_dialect=table 表示使用表模型,不能去掉。root / root 仅为开发示例,生产环境请修改。
# 3.3 启动校验与切换说明
① 启动校验:项目启动时,只初始化 yudao.iot.storage.type 选中的时序库:
- 校验同名数据源已经配置。IoTDB 还会执行上面 ③ 的检查,只读取配置,不会修改 IoTDB 的任何配置。
- 设备消息表
device_message不存在时自动创建。其中,IoTDB 的device_message已存在时,还会核验表结构;TDengine 已存在时直接跳过。 - 任一步骤失败时,打印错误日志并退出进程,不会悄悄回落到
master业务库。
② 建表时机:产品属性表 product_property_{productId} 不会在启动时全量创建,而是在产品「发布」或「同步物模型」时,根据物模型创建或更新。详见 《物模型配置》 文档。
③ 切换时序库:修改 yudao.iot.storage.type 并配置好数据源后,需要对已有的产品(包括内置的演示产品)执行「同步物模型」,在当前选择的时序库中创建属性表。原时序库的历史数据不会自动迁移,新库只保存切换后新写入的数据。
④ 表结构校验:IoTDB 已存在的 device_message 表,其字段、类型和 TAG(只能是 device_id)需与 IotDeviceMessageIoTDBMapper.xml 的 createTable 建表定义一致,否则启动校验失败。项目不会自动修改、删除已有表。产品属性表不在启动时全量核验。
# 3.4 IoTDB 设备消息的限制
重要
- TDengine 的
device_message使用ts+id作为复合主键,同一设备、同一毫秒的多条消息(id不同)可以同时保留。 - IoTDB 的
device_message是一张普通表,device_id是唯一的 TAG,id只是普通的 FIELD 列。也就是说,同一设备、同一毫秒写入多条消息时,后写入的整行会覆盖先写入的,即使消息id不同。例如说,间隔很短的请求与响应消息,也可能互相覆盖。
因此,IoTDB 不保证完整保留每一条设备消息日志。如果需要逐条完整保留,建议使用默认的 TDengine。
# 4. 第四步,重启项目
① 重启后端项目,然后访问前端的 IoT 菜单,确认功能是否生效。如下图所示:

至此,我们就成功开启了 IoT 的功能 🙂
② (可选)同步内置的测试产品的物模型配置,创建对应的表结构到当前选择的时序数据库(TDengine 或 IoTDB)中。如下图所示:

# 5. 阅读指南
IoT 手册的文章较多,建议按照以下顺序阅读,循序渐进:
# 5.1 第一阶段:基础管理(必读)
先掌握产品、物模型、设备三个核心概念:
# 5.2 第二阶段:设备接入(按需阅读)
了解设备如何接入平台,先看概述,再根据协议需求选读:
- 设备接入(概述) —— 务必先读! 整体架构、消息格式、认证方式
- 设备接入(MQTT 协议) —— 最常用的协议,推荐优先阅读
- 其它协议按需选读:HTTP、EMQX、TCP、UDP、WebSocket、CoAP、Modbus Client、Modbus Server
- 设备接入(自定义协议) —— 扩展新协议的开发指南
# 5.3 第三阶段:进阶功能(按需阅读)
根据业务需要选读: