feat(device): 一期设备域 I1-I5 全量实现(APP 接口/后台管理/OTA/MQTT/直播)

模块接入:
- 新增 ruoyi-device(org.dromara.device)并注册到根/ruoyi-modules/ruoyi-admin pom

APP 侧(/app/**,需登录,仅本人绑定设备):
- 账号闭环:短信/邮箱验证码注册登录、密码重置(不跨界返回散列)
- 设备:绑定/列表/详情/重命名/解绑(越权统一"设备不存在",防 IDOR)
- 眼罩开关(/app/device/{deviceNo}/hood,低电不对称拦截)
- 定位(/app/device/{deviceNo}/location)
- 直播(/app/stream 6 端点 + /app/device/{deviceNo}/live,自建 ZLMediaKit,设备主动推流)

后台(/device/**):
- 设备 CRUD/统计/删除/导出(ExcelBuilder)
- OTA(6 端点:升级包管理 + 批量下发,total==created+skipped+failed)

MQTT(T05):
- 遥测/事件/ack 监听、指令下发+回执(防串设备)、离线扫描、低电告警
- 报文身份仅来自 Topic,反查 device_id 防跨设备伪造

数据与脚本:
- script/sql/ry_device.sql(6 表/字典/权限字/菜单)、bm_patch.sql
- script/mqtt 设备模拟器(mqtt-simulate.js)

安全:
- MQTT broker 凭据外置为环境变量 MQTT_USERNAME/MQTT_PASSWORD,不落明文
- ZLM webhook 密钥外置为环境变量 ZLM_SECRET(未配置时 /zlm/hook/** 失败关闭),不落明文
This commit is contained in:
yuhaiming
2026-09-17 10:10:38 +08:00
parent 926426fe4f
commit 79b739fe02
142 changed files with 14627 additions and 7 deletions

View File

@@ -14,7 +14,17 @@ server:
min: 8
# 最大线程数
max: 256
zlm:
host: ${ZLM_HOST:http://220.203.23.195:9090} # ZLMediaKit 地址
rtmp-host: ${ZLM_RTMP_HOST:rtmp://220.203.23.195:1935}
rtsp-host: ${ZLM_RTSP_HOST:rtsp://220.203.23.195:554}
webrtc-host: ${ZLM_WEBRTC_HOST:http://220.203.23.195:9090}
secret: ${ZLM_SECRET:} # ZLM webhook 密钥:不落明文,必须通过环境变量 ZLM_SECRET 注入;未配置时 /zlm/hook/** 回调一律拒绝(失败关闭)
app: live
schema: rtmp
push-protocol: rtmp
play-expire-seconds: 120
stream-timeout: 30 # 流超时秒数
captcha:
# 是否启用验证码校验
enable: true
@@ -111,6 +121,7 @@ security:
- /warm-flow-ui/config
- /snail-chat/**
- /api/snail/chat/**
- /zlm/hook/**
# MyBatisPlus配置
# https://baomidou.com/config/
@@ -264,15 +275,17 @@ mqtt.client:
# 是否开启客户端,默认:true
enabled: true
# 连接的服务端 ip ,默认:127.0.0.1
ip: ssl://www.mmipco.cn
ip: 47.97.217.123
# 端口:默认:1883
port: 8883
port: 1883
# 客户端名称
name: Mqtt-Client
# 客户端Id(非常重要,一般为设备 sn,不可重复)
client-id: 000001
username: admin
password: 61e6062129e9
client-id: bird_monitor
# MQTT broker 账号/密码:不落明文,通过环境变量注入(避免凭据进入 git 历史)。
# 联调前 export MQTT_USERNAME / MQTT_PASSWORD;未配置时取空值,broker 会拒绝认证。
username: ${MQTT_USERNAME:}
password: ${MQTT_PASSWORD:}
# 超时时间,单位:秒,默认:5秒
timeout: 5
# 重连时间,默认 5000 毫秒
@@ -291,12 +304,35 @@ mqtt.client:
mqtt-executor-size: 2
# 是否开启 ssl
ssl:
enabled: true
enabled: false
keystore-path:
keystore-pass:
truststore-path:
truststore-pass:
--- # 设备域通信链路配置(《设备通信协议-一期.md》口径)
# 全部项均有代码默认值,此处显式列出仅为便于运维调参;不需要调时整段删除也不影响启动。
device.mqtt:
# 离线扫描总开关。关闭后设备不会再被自动置离线,仅用于联调排障,生产必须为 true
scan-enabled: true
# 离线扫描间隔(上一轮跑完再计时,不会因扫描耗时堆积)
offline-scan-interval: 30s
# 离线判定阈值:超过该时长无遥测即判离线(协议 Q2:上报周期 60s × 2 容错)
offline-threshold: 120s
# 单轮扫描的设备上限,防止异常时一次性拉爆内存
scan-batch-size: 500
# 低电告警触发阈值(≤ 该值触发)与恢复阈值(≥ 该值恢复),两者之间的区间为滞回防抖区
low-battery-threshold: 20
low-battery-recover-threshold: 25
# 低电滞回闩锁存活时长,仅作已注销设备的残留清理兜底
low-battery-latch-ttl: 30d
# 告警去重窗口:同一 设备+告警类型 在窗口内只落一条 bm_device_alert
alert-dedup-window: 30m
# 眼罩指令回执等待超时(协议 Q3 待硬件确认动作到位时长)
hood-timeout: 5s
# 待回执指令标记的 Redis TTL(仅用于事后定位「回执晚到」)
pending-ack-ttl: 10m
--- # elasticsearch 功能配置
# 文档地址: https://www.easy-es.cn/
# 更改包名需要去 EasyEsConfiguration 修改包扫描(后续版本支持配置文件读取)