news 2026/8/7 10:38:02

设备管理注册心跳远程指令屏幕是怎么活起来的

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设备管理注册心跳远程指令屏幕是怎么活起来的

上篇搞定了权限体系。这篇开始做第一个业务模块——设备管理。

设备是整个系统的第一环。没有设备注册进来,后面素材、节目、统计都无从谈起。


设备有哪些属性

回到之前画的表结构:

CREATETABLEt_device(idBIGINTPRIMARYKEY,device_noVARCHAR(50)NOTNULL,-- 设备编号(唯一)nameVARCHAR(100)NOTNULL,-- 设备名称modelVARCHAR(50),-- double_side/stand/wallgroup_idBIGINT,-- 所属分组resolutionVARCHAR(20)DEFAULT'1920x1080',layout_templateVARCHAR(50)DEFAULT'single',-- 分屏布局statusVARCHAR(20)DEFAULT'offline',-- online/offline/errorip_addressVARCHAR(50),last_heartbeatDATETIME,...);

每个字段都有它的来由:

  • device_no:设备唯一编号,相当于身份证。心跳上报和节目下发都靠它
  • model:双面屏、立式屏、壁挂屏——不同型号播放器适配不同
  • layout_template:单屏、左右分屏、上下分屏、三区——影响素材怎么排
  • status:不在线的设备不发节目,避免浪费流量
  • last_heartbeat:判断在线的依据——超过 5 分钟没心跳就算离线

设备分组的取舍

要不要做设备分组?我想了想——如果只有三五台设备,分组是多余的。但如果一个客户有 20 家门店,每家店 2 块屏,40 台设备不分组根本管不过来。

所以我做了分组,但做得极简:t_device_group就三个字段——名称、描述、创建更新时间。不搞嵌套分组,不搞继承关系,一级分组够用。


心跳机制

设备怎么上报心跳?一条 POST 请求:

POST /api/v1/devices/{deviceNo}/heartbeat

后端更新last_heartbeat时间。前端列表页根据心跳判断在线状态:

  • 5 分钟内有心跳 → 🟢 在线
  • 超过 5 分钟 → ⚪ 离线
  • 超过 30 分钟且之前在线 → 🔴 异常

这个接口是公开的——不需要登录。设备端播放器没有用户概念,它只管上报。


远程指令

有时候需要远程操作设备——重启、关机、调音量、调亮度。这些叫"指令":

@PostMapping("/{id}/command")@RequirePermission("device:command")publicApiResult<Void>sendCommand(@PathVariableLongid,@RequestBodyCommandDTOdto){deviceService.sendCommand(id,dto);returnApiResult.success();}

指令发出去后,状态流转是:

pending → sent → success/failed

设备下次心跳时拉取待执行指令,执行完上报结果。不是实时的——但够用了。


Controller 全貌

50 个 Java 文件里,DeviceController 是最大的一个:

GET /api/v1/devices → 列表(分页 + 搜索) POST /api/v1/devices → 新增设备 GET /api/v1/devices/{id} → 设备详情 PUT /api/v1/devices/{id} → 编辑设备 DELETE /api/v1/devices/{id} → 删除设备 GET /api/v1/devices/{id}/commands → 指令历史 POST /api/v1/devices/{id}/command → 发送指令 GET /api/v1/devices/groups → 分组列表 POST /api/v1/devices/groups → 新建分组 DELETE /api/v1/devices/groups/{id} → 删除分组 GET /api/v1/devices/{deviceNo}/current-program → [公开] 拉取当前节目 POST /api/v1/devices/{deviceNo}/heartbeat → [公开] 心跳上报 POST /api/v1/devices/{deviceNo}/play-log → [公开] 播放日志

认证接口 6 个,公开接口 3 个。每个认证接口都标了@RequirePermission——viewer 只能看列表,operator 能增能改,admin 能删。


到这里设备管理模块就完成了。设备能注册、有心跳、能分组、能远程发命令。下篇做素材管理——上传图片视频、分类管理。素材是整个系统里文件最多的模块。



关于作者:无羡,独立开发者,全栈工程师,专注 AI 应用与微服务架构。

📌 分类:技术复盘

🔗 个人博客 — 更多技术文章
✨ 开发者福利整理 — 云服务资源汇总
📂 软件工坊 — 我的技术分享
🌐 个人门户 — 独立开发作品全集

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/7 10:36:41

AI进农田:150亩芝麻一夜枯死的警示

博主介绍 &#x1f468;‍&#x1f4bb; 了解博主&#xff1a;波仔椿 &#x1f4d6; 人生箴言&#xff1a;AI 不会淘汰人&#xff0c;但会用 AI 的人会淘汰不会用的人。 &#x1f9f0; 我的专栏&#xff1a;AI杂谈会 文章内容 我前两天刷到一则新闻&#xff0c;看完心里挺不是…

作者头像 李华
网站建设 2026/8/7 10:36:27

SpringBoot公共交通系统实战:从零部署到二次开发全解析

这次我们来看一个基于SpringBoot的公共交通路线应用系统。这是一个典型的毕业设计/课程设计实战项目&#xff0c;它不是一个简单的Demo&#xff0c;而是包含了完整的前后端功能、数据库设计、源码、文档报告、代码讲解&#xff0c;甚至附带了万字论文和PPT。对于正在寻找Java W…

作者头像 李华
网站建设 2026/8/7 10:36:12

回调与监控,用Callbacks追踪Agent的每一步执行过程

回调与监控&#xff0c;用Callbacks追踪Agent的每一步执行过程 上一篇把LCEL表达式语言讲完了&#xff0c;管道符一路接到底&#xff0c;链跑得也挺顺。但有个事一直憋着没说&#xff0c;链跑起来之后里面到底发生了什么&#xff0c;哪一步调了模型&#xff0c;哪一步调了工具…

作者头像 李华
网站建设 2026/8/7 10:36:07

空调怎么选,一般多少钱一台?

很多消费者在搜索“空调怎样选一般多少钱一台”时&#xff0c;往往先看价格&#xff0c;再比参数&#xff0c;却在安装环节吃了亏。实际上&#xff0c;选购空调的核心逻辑应当是先确定使用场景&#xff0c;再匹配匹数大小&#xff0c;结合售前体验与售后服务来确定预算。具体价…

作者头像 李华
网站建设 2026/8/7 10:35:38

深入解析CPU三层架构:从指令集到微架构再到产品形态

1. 从“买电脑”说起&#xff1a;为什么你需要了解CPU的这三层 每次看到电脑配置单上那些让人眼花缭乱的参数——i7-13700K、AMD Ryzen 9 7950X、Apple M2 Max——我们其实是在看一个复杂系统的最终成品。这些名字背后&#xff0c;是CPU&#xff08;中央处理器&#xff09;这个…

作者头像 李华
网站建设 2026/8/7 10:35:13

分布式数字取证平台FTK Lab架构与实战解析

1. 项目概述&#xff1a;数字取证领域的协作革命 在数据爆炸式增长的时代&#xff0c;传统单机取证工具已经难以应对海量电子证据的处理需求。我们团队开发的FTK Lab解决方案&#xff0c;正是针对这一痛点设计的分布式数字取证平台。这套系统允许10人以上的调查团队同时处理PB级…

作者头像 李华