返回作品

岸基监控系统

创建于 2025 年 3 月 21 日

标签
  • Java 8
  • Spring Boot 2.5
  • RuoYi-Vue 3.8.9
  • easy-query
  • MyBatis-Plus
  • MySQL
  • Vue 2
  • Element UI
  • 高德地图 JS API
  • Hutool
  • JavaMail

项目介绍

海上无人船(或小型船舶)执行任务时,岸基需要实时掌握其位置、航行状态与设备健康度,而近海通信条件有限,往往依赖北斗链路。这个项目为这一场景搭建了一套完整的岸基监控闭环:船上 SV3 终端(太阳能供电)通过北斗通讯与岸基交互,把位置和遥测数据以”设备位置通知”邮件的形式回传;岸基系统定时读取邮箱、解析邮件、更新设备数据并沉淀位置日志;值班人员在 Web 端的高德地图上直观看到船只分布、遥测详情与历史轨迹,并通过邮件通道向设备下发航行指令。

项目的核心设计是”邮件即消息总线”:MailController/app/mail/read 接口以 POP3 协议连接 163 邮箱(pop.163.com:110),遍历收件箱并按主题过滤出”设备位置通知”邮件,递归解析 text/*multipart/*message/rfc822 各类型的正文,将 JSON 反序列化为 DeviceInfo 后调用 easy-query 更新设备表,同时校验到设备 ID 时向 device_log 插入一条带当前时间的位置日志。前端页面每 5 分钟调用一次该接口拉取最新邮件数据,形成稳定的数据回流链路。

项目架构

项目是若依 RuoYi-Vue 3.8.9 标准的单体前后端分离结构,后端 Maven 多模块(ruoyi-adminruoyi-frameworkruoyi-systemruoyi-commonruoyi-generatorruoyi-quartz),Spring Boot 2.5.15 + Java 8,前端为 Vue 2.6 + Element UI 2.15 + vue-router/vuex/axios 的经典若依前端工程。

后端在若依默认 MyBatis-Plus(3.5.4)的基础上引入了 easy-query(易查 ORM)作为主要查询引擎:业务实体通过 @EntityProxy 注解生成 DeviceInfoProxy/DeviceLogProxy 代理类,DeviceInfoController 注入 EasyEntityQuery,用类型安全的链式 where(x -> x.deviceId().eq(...)) 构建动态条件查询,并以 orderBy(x -> x.id().desc()) 排序;删除时通过 disableLogicDelete() 显式禁用逻辑删除走物理删除。数据库为 MySQL,业务仅两张表:device_info(设备信息与最新遥测数据)和 device_log(位置日志,含设备 ID、经纬度、创建时间),其余为若依系统表。

前端自定义业务集中在 src/views/map/index.vue(地图监控)与 src/views/app/device/index.vue(设备管理),菜单”地图”作为顶级目录挂在若依菜单体系下(sys_menupath: 'map/index')。地图页动态加载高德地图 JS API v2.0,核心交互对象包括 AMap.MapAMap.Marker(船型分类标记)、AMap.Polyline(轨迹线)、AMap.InfoWindow(时间点信息窗)与 AMap.ToolBar 缩放控件。

核心功能

  • 设备信息管理/app/info/* 接口提供设备列表(列表接口会顺带查出每台设备按时间倒序的位置日志挂到 deviceLogs 字段)、详情、新增、修改、物理删除与 Excel 导出(ExcelUtil + POI)。前端设备列表页支持按设备唯一标识、通讯方式、设备类型、通讯 ID、北斗接收方号码、协议名称、目标端口、设备类八个条件组合筛选,并提供”历史航行”操作按钮,用 el-timeline 时间线展示某台设备的航行记录。
  • 地图实时监控:地图默认以上海附近海域(122.20, 31.10)为中心,页面加载后调用设备列表接口把经纬度转换为 AMap.LngLat 生成标记;按 deviceId 首位数字分类——1 渔船红色、2 货船蓝色、3 科考船绿色、4 客运船黄色,标记带掉落动画与彩色标签。点击标记弹出设备详情对话框,含基本信息(通讯方式、设备类型、接收时间)、详细信息(航行速度、航向角、海水温度、湿度、风向、风速、设备舱温度、电池电量、通讯质量、工作状态)与指令发送三个页签;页面每分钟刷新一次设备数据、每 5 分钟读取一次邮箱,保证位置与遥测接近实时。
  • 历史航行轨迹device_log 持续记录设备位置点,前端”显示轨迹”功能读取 deviceLogs,校验经纬度合法性后按时间正序排序,用 AMap.Polyline(蓝色、带方向箭头)绘制连续轨迹线,起点/终点使用特殊标记图标,中间每个时间点用小圆点标记,点击弹出信息窗显示该点时间,最后 setFitView 自动缩放地图适配整条轨迹;不足两个点时退化为单点标记提示。
  • 邮件数据回流:后端以 POP3 读取 163 邮箱,仅处理主题包含”设备位置通知”的邮件,递归解析邮件正文并 JSONObject.parseObject 还原设备对象,更新设备遥测数据(速度、航向、水温、湿度、风向、风速、设备温度、电池电量、信号质量、工作状态、经纬度),并按设备 ID 写入位置日志;前端”读取邮件”按钮可直接触发该流程并刷新页面数据。
  • 指令下发与位置上报:指令表单支持设置航行目标点(经纬度)、传感器控制开关(海水温度、湿度、风向、设备舱温度)与系统信息获取,前端把指令拼装为邮件正文通过 /app/mail/send(Hutool MailUtil + mail.setting 配置)发送给设备,发送结果以操作结果弹窗反馈(仅 admin 角色可发送);“当前位置(模拟)“页签支持手动录入并保存全部遥测数据(保存后自动追加位置日志、刷新地图标记),也可一键把当前位置信息以邮件发送并记录日志。

功能截图

暂无运行截图。

快速上手

项目分后端与前端两部分,均基于若依工程结构。先执行根目录 20250321.sql 初始化 MySQL 数据库(含 device_infodevice_log 两张业务表及若依系统表、预置设备样例数据),再按需修改 ruoyi-adminapplication.yml 数据库连接;MailController 中的邮箱账号/授权码、mail.setting 的收件人配置需替换为实际可用的 163 邮箱授权码。

后端 mvn package 打包后启动 ruoyi-adminRuoYiApplication;前端在 20250321-岸基监控-webnpm installnpm run dev,浏览器访问前端地址,使用 admin 账号登录。若依代码生成器(/tool/gen)已配置好 device_info 的生成记录,可直接复用生成新版本 CRUD;地图页面使用高德地图 JS API,代码中内嵌了测试用的 MAP_KEY,正式使用时应迁移到环境变量或服务端配置。

总结

这个项目的亮点在于用最轻量可靠的方式打通了”海上设备 ↔ 岸基系统”的通信链路:不直接解析北斗报文协议,而是以邮件作为结构化消息通道——设备侧发送位置通知邮件、岸基侧定时 POP3 拉取解析、前端定时轮询刷新,配合高德地图的标记、轨迹与信息窗能力,用较少的代码量实现了完整的岸基监控闭环。

从代码可以看到项目的演进痕迹:device_info 中的 dataInfo 字段保留了早期整段 JSON 快照的设计,随后被拆分为速度、航向、水温等独立字段;设备管理页大量遥测字段被注释保留,功能重心明显向地图监控页迁移。整体上这是一个从若依代码生成器起步、逐步定制出业务形态的典型实践。后续可扩展的方向包括:将邮件拉取改为主动轮询的定时任务(若依 Quartz)或消息队列实时推送、增加设备离线判定与告警提醒、接入真实北斗协议解析模块,以及把轨迹数据落成独立航线表以支持任务回放分析。