IBMS 项目机构设计与硬件设备对接技术栈
1. 项目定位
IBMS(智能楼宇集成管理平台)面向公共资源交易中心园区,把建筑内的智能照明、温湿度/烟感环境传感、门禁、一卡通、人脸道闸、视频监控、LED 信息屏、开标/评标业务场景 统一接入、联动控制与可视化展示;同时与海康威视安防平台、内部数据总线、第三方排队叫号/短信/CA 认证等系统互通。
整体架构是 Spring Cloud 微服务 + 服务治理 + 多类异构协议混合接入 的形态:业务侧大量使用 HTTP REST(第三方平台 OpenAPI) ,现场设备侧使用 自定义 UDP/TCP + HEX 指令 + MODBUS 风格 CRC16 ,屏幕类设备由 WebSocket 实时推送驱动。
2. 整体框架与技术栈
2.1 基础技术清单
| 分类 | 选型 | 版本 / 说明 |
|---|---|---|
| 语言 / 构建 | JDK 1.8 / Maven 多模块 | 全局 parent pom.xml |
| 微服务框架 | Spring Boot / Spring Cloud | Boot 2.1.2.RELEASE 、Cloud Greenwich.M1 (流媒体服务 ibms-stream 例外,Boot 2.4.3) |
| 注册中心 | Netflix Eureka | ibms-eureka,端口 8000,context-path /registry |
| 服务调用 | OpenFeign + Hystrix | 接口集中在 ibms-base/ibms-rpc/*-rpc,FallbackFactory 兜底,超时约 20s |
| 安全认证 | Apache Shiro 1.4.2 + Thymeleaf-extras-shiro + Redis 会话 | ibms-framework 提供 |
| 单点登录 | Apereo CAS 5.2.3(独立 war 覆盖工程) + GDCA CAKey/国密证书 | ibms-ui/ibms-cas |
| ORM | MyBatis(boot 1.3.2)+ PageHelper + Velocity 代码生成 | Mapper XML 手写 SQL |
| 关系库 | Oracle(主库)+ MySQL(部分第三方只读) | Druid 1.1.14 动态数据源 MASTER/SLAVE;驱动 ojdbc14-12.1、mysql-connector 5.1.38 |
| NoSQL | MongoDB(设备/告警数据集合)+ Redis(缓存/快照) | Mongo 库 iot(172.29.95.237:27017) |
| 定时任务 | Quartz(独立 ibms-job 服务) |
周期表达式存 sys_job 表,表驱动 |
| 消息总线 | 内部conch 平台(easyopen OpenAPI) | com.gitee.easyopen:sdk-java,实际承担设备数据上行 |
| MQ(Kafka) | kafka-clients 0.11.0.0 / Spring-Kafka | 已停用 ,//@Component 注释保留 |
| 设备网络通信 | Apache MINA 2.1.3 | 运行期仅使用 NioDatagramConnector(UDP),无编解码器、读操作模式 |
| 实时推送 | Spring WebSocket | ibms-device-service 提供 /websocket 端点广播给各信息屏 |
| 视频处理 | javacv / javacv-platform 1.5.1(内嵌 FFmpeg) | RTSP → RTMP 推流;配合 nginx-rtmp / nginx-http-flv 分发 |
| 海康对接 | com.hikvision.ga:artemis-http-client 1.1.2 + JNA 5.6.0(HCNetSDK) |
Artemis HTTP API 为主;JNA 仅存在于参考工程/测试 |
| 前端渲染 | Thymeleaf 服务端页面 + jQuery / WeUI / ECharts / iView / videojs-hls / 海康视频 Web 插件 | 各 UI 服务 |
| 监控告警 | Spring actuator + micrometer + Prometheus + 企业微信机器人 | /actuator/prometheus 暴露指标 |
| 工具库 | fastjson、hutool、commons-net(NTP)、POI/EasyExcel、dozer、lombok、swagger2 | 公共 ibms-common-core |
2.2 微服务模块划分
仓库 README 定义的分层为 provider(业务模块)/ consumer(UI 模块)/ 公共(base/entity/rpc):
ibms(根工程)
├── ibms-eureka 注册中心(8000,/registry)
├── ibms-base 基础支撑
│ ├── ibms-common-core 公共常量/工具:PushConchUtil、HttpUtils、NTP、常量
│ ├── ibms-modules-core 提供者通用:Druid 动态数据源、ArtemisUtil(海康封装)
│ ├── ibms-framework Shiro/Redis/安全/日志框架
│ ├── ibms-ui-core UI 消费者通用
│ └── ibms-rpc Feign 接口(system/equipment/business/job/gen-rpc)
├── ibms-entity 实体工程(system/gen/job/business/equipment-entity)
├── ibms-modules 业务提供者(端口)
│ ├── ibms-system 系统管理 [8082]
│ ├── ibms-job Quartz 定时调度 [8083]
│ ├── ibms-equipment 设备物模型/场景联动 [8084]
│ ├── ibms-business 门禁/一卡通/视频/开评标业务 [8085]
│ ├── ibms-device ★设备接入专题(见 3)
│ │ ├── ibms-device-access 可运行服务 ibms-device-service [8086]
│ │ ├── ibms-device-jar 动态协议 Handler(独立 jar 反射加载)
│ │ └── ibms-device-parent 设备基类/工具库
│ ├── ibms-gen 代码生成 [9001]
│ └── ibms-sms 短信中间件 [9095]
└── ibms-ui 前端消费者
├── ibms-admin 后台管理 [8080]
├── ibms-mobile 移动端控制 [8081]
├── ibms-show 可视化/大屏 [9092]
├── ibms-cas CAS SSO [9091]
└── ibms-stream 流媒体服务器(RTSP拉流→RTMP推流) [9094]
3. 设备接入的总体设计(核心机制)
现场设备对接不写死在代码里,而是**"数据库驱动 + 协议动态装载 + 轮询触发"**,这是理解整套对接方式的关键:
-
设备物模型 (Oracle,
ibms-equipment维护)t_device_info:设备实例(ip、port、category_id、status、start_status 等)t_device_category:设备类别(灯光/门禁/传感器/烟雾/屏幕...,同时映射系统字典)t_device_command:每台设备对应的 HEX 指令 ,type:0关灯、1开灯、2查询/取数t_agreement:协议配置,字段含url(协议 jar 路径)、action(Handler 类名)、topic(上行数据主题)
-
动态装载协议 :
ibms-device-access启动时联查T_Device_Info ⋈ T_DEVICE_CATEGORY ⋈ T_AGREEMENT得到设备清单(IP/端口/topic/协议 jar 路径/类名),对每个 IP:PORT 用 MINA 建立 UDP 连接,并以URLClassLoader从 jar 反射加载对应 Handler 类:IoHandlerAdapterUtil.getInstance("file:"+url, action)(ibms-device-parent/.../utils/IoHandlerAdapterUtil.java)。也就是说,每种现场设备的报文解析逻辑被打成独立协议 jar(ibms-device-jar),由数据库指向加载,新增设备协议无需改主服务。
-
控制指令来源库表 :灯/温湿度等 MODBUS 风格指令(如
01 03 000D 0001+CRC16)由实施按厂商文档计算 CRC 后录入t_device_command,运行期按 type 取出下发(doc/03设备服务对接/03灯光及温湿度/灯光温湿度操作命令计算.txt)。 -
触发方式 :
ibms-job(Quartz)→ Feign 回调ibms-device-service的/device/access/*HTTP 接口 → MINAsession.write(hex)+ 同步read()(2s 超时)完成"查询/控制"。
4. 各类硬件/第三方对接技术栈明细
| 设备 / 系统 | 对接通道 | 关键技术栈 | 数据方向 | 关键实现(相对仓库根) |
|---|---|---|---|---|
| 智能照明(8 路开关模块) | UDP + HEX 指令 | MINA NioDatagramConnector;指令查 t_device_command(0关/1开/2查);应答 hex 转 8 位二进制,反序映射各区域灯光 |
双向 | ibms-device-jar/.../LightUDPClientHandler.java;ibms-device-access/.../DeviceAccessServiceImpl.java、DeviceAccessController.java#sendCommand/startLight/searchStatus;ibms-job/.../LightStatusTask.java(状态写 Redis light_status) |
| 温湿度传感器 | UDP + HEX 指令 | 帧 hex 第 6-13 位解析温度/湿度,÷10 得实际值 | 上行 | SensorUDPClientHandler.java;SensorTask.java |
| 烟雾 / 红外传感器(开关量采集) | UDP + HEX 指令 | 帧如 FE 02 01 01 50 5C,第 4 字节 01烟感/02红外/03两者/00无;报警上行推送"海螺"ibms.info.dealAlarm |
上行 | SmokeUDPClientHandler.java;SmokeSensorTask.java;ibms-equipment/.../TDeviceInfoServiceImpl.java#dealAlarm(落 t_security_alarm) |
| LED 条屏(开标室横屏等) | UDP + HEX 指令 | ASCII 内容 !#001%Z01... 按 CRC16 转 hex 下发 |
下行 | DeviceAccessController.java#ledPush;ibms-device-access/.../utils/CRC16Util.java |
| 海康门禁(门禁点/门禁控制器) | HTTPS REST(Artemis / iSecure Center) | appKey/appSecret 签名,/api/resource/v2/door/search、`/api/acs/v1/door/states |
doControl、/api/acs/v2/door/events` |
双向 |
| 海康一卡通 / 人脸 / 门禁授权 | HTTPS REST | person/card/face/授权下载(acps)系列接口,每批 100 条 | 下行 | TCardServiceImpl.java |
| 员工通道闸(人脸闸机) | 内部"海螺"网关(easyopen) | pullWithConchObject("ibms.gate.setCardInfo/delOneFace/delCardInfo") 下发到道闸客户端;道闸侧参考工程用 HCNetSDK.dll + JNA (NET_DVR_Login_V40 等) |
下行 | TCardServiceImpl.java#hkChannel/deleteChannel;参考实现 doc/03设备服务对接/09员工道闸/ibms-gate/;接口契约 ibms-ui/ibms-admin/src/test/java/HkGateTest.java |
| 视频监控(预览/回放/云台/事件) | HTTPS REST + 浏览器插件 + 事件回调 | /api/video/v1/cameras/previewURLs(rtmp/hls/rtsp)、playbackURLs、/api/video/v1/ptzs/controlling;前端海康 oWebControl 插件按 cameraIndexCode 播放;刷卡/门禁事件由回调接口接收 |
双向 | ibms-business/.../TVideoSystemServiceImpl.java;ibms-show/.../templates/tender/large.html、.../lobby/* |
| 监控视频拉流转推(第三方/直连取流) | RTSP → RTMP | javacv FFmpegFrameGrabber 拉 rtsp://ip/h264/ch{ch}/{stream}/av_stream → FFmpegFrameRecorder 推 rtmp://nginx:1935/ovtrtmp/{token};nginx-http-flv 分发 HLS/FLV;无流自动中断 |
下行 | ibms-ui/ibms-stream/(CameraController/CameraPush/CameraTimer);文档 doc/03设备服务对接/27ffmpeg/、02海康平台/ |
| 开标/评标信息屏、双屏小屏、中厅大屏、监控屏 | WebSocket 广播 | 业务侧经 Feign 调 /device/access/sendWebSocketMsg → @ServerEndpoint("/websocket") 广播,消息 type 0~11 语义(切屏/文字/视频流/控制);视频以大屏内嵌 HLS/插件播放 |
下行 | ibms-device-access/.../config/WebSocketMain.java;`ibms-job/.../BiddingPushTask |
| 开标室/中厅 LED 大屏、电视屏 | 定时刷新 + HTTP + 独立小程序/动态库 | 32 寸横屏按 MAC 识设备定时拉 /tv/* 数据;电视屏有 Android app(build.gradle)与 .NET WebApplication2 开关页等外围工程 |
下行 | ibms-show/.../templates/bidopen/p1~p4;外围见 doc/03设备服务对接/10、11、12、13 |
| 排队叫号系统数据 | JDBC 直读第三方库 | 动态数据源 SLAVE,SQL 为 MySQL 方言,读 view_ticket_history(叫号/办结/评价率) |
只读上行 | ibms-business/.../ZshjDataServiceImpl.java + ZshjDataMapper.xml |
| 海康道闸通行记录 | JDBC 直读 | 读 hk_channel_record / HK_DEVICE_INFO(测试环境 Oracle 用户 ZJQDXT) |
只读上行 | HkChannelRecordServiceImpl.java + HkChannelRecordMapper.xml |
| 刷卡考勤 | 自身 Oracle 整理 | 每日汇总打卡/迟到早退判定 | - | TAttendanceRecordServiceImpl.java |
| 短信(设备故障/场景) | CXF WebService | JaxWsProxyFactoryBean 调金桐 kingtonSms(172.18.241.48/zhjyzhyzxt/ws) |
下行 | ibms-equipment/.../TSceneControlServiceImpl.java#sendSms;ibms-job/.../SmsTask.java |
| 时间校时(NTP) | NTP/UDP | commons-net NTPUDPClient(ntp.ip),大屏页 /tv/getTime |
下行 | ibms-common-core NtpUtils;ibms-show 页面 |
| 设备故障巡检(摄像头/门禁等) | Ping + 端口探测 + 指令 | ICMP 3s 超时 → UDP connect → 下发 type=2 指令 2s 无应答即故障;写 t_device_breakdown + 推海螺 ibms.alarm.data + 短信 |
巡检 | ibms-job/.../DeviceAlarmTask.java + DeviceAccessServiceImpl.java#rvscanDeviceTask/norvscanDeviceTask |
| 服务器/服务监控 | HTTP + 企业微信 | 拉 Prometheus 聚合网关 getPrometheusInfo,Down 推企微机器人,内存去重 |
巡检 | ibms-job/.../ZsPrometheusMonitorTask.java |
| 开评标数据同步 | 海螺网关(easyopen) | pullConchObject("ibms.bid.version"/"ibms.bid.info") 增量落 t_bidding_record |
只读上行 | ibms-business/.../TBiddingRoomServiceImpl.java#synBidding |
| CA / CAKey 登录 | USBKey + HTTPS | 前端 GDCA 库读证书 → 后端 POST 外部 CA 服务 /ggzyca/main/getUserCert → 按 cakey 登录;另提供 Apereo CAS 统一认证 |
认证 | ibms-ui/ibms-admin/.../SysLoginController.java#caLogin、static/gdca/*;ibms-cas/;文档 doc/03设备服务对接/08登陆KEY对接/ |
周边(不属于设备协议,但对平台有意义)
- 蜂鸟云 (
doc/03设备服务对接/01蜂鸟云/):提供行政服务中心 3D 场景/地图资源包,用于三维可视化大屏素材,非设备通信协议。
5. 关键数据流
5.1 下行控制链路(页面/场景 → 现场设备)
页面(ibms-admin / ibms-mobile / 大屏) 或 场景联动(Quartz)
│
├─ 灯光/传感器:Feign → ibms-device-service [8086] /device/access/sendCommand|startLight|searchStatus
│ → MINA UDP session.write(HEX 指令) → 现场模块 (指令查 t_device_command)
│
├─ 门禁:ibms-equipment → Feign → ibms-business → TDoorServiceImpl
│ → Artemis HTTPS /api/acs/v1/door/doControl → 海康平台 → 门禁控制器
│
├─ 一卡通/人脸:ibms-business → TCardServiceImpl
│ → Artemis(人员/卡/人脸/授权下载)
│
├─ 员工道闸:ibms-business → TCardServiceImpl
│ → 海螺网关 ibms.gate.setCardInfo/delCardInfo/delOneFace → 道闸客户端(HCNetSDK)
│
├─ 信息屏:ibms-job/BiddingPushTask 等 → Feign sendWebSocketMsg
│ → ibms-device-service /websocket 广播 → 各屏 JS 渲染
│
└─ 监控画面:ibms-business → Artemis previewURLs(rtmp/hls) → 页面插件播放;
或 ibms-stream javacv RTSP→RTMP → nginx → HLS/FLV
5.2 上行数据链路(现场设备 → 平台/业务)
传感器/烟感/灯光状态上报(设备主动或查询应答)
→ MINA Handler(SensorUDPClientHandler 等)解析
→ PushConchUtil HTTP POST "海螺" data.receive(topic 来自 t_agreement)
→ 海螺落 MongoDB(ibms.sensor.data / ibms.alarm.data 等)
→ 业务告警:ibms.info.dealAlarm → ibms-equipment 写 t_security_alarm + 短信
设备故障巡检(ibms-job 定时)
→ Ping/UDP 探测/指令超时 → 写 t_device_breakdown → 推海螺 ibms.alarm.data
→ SmsTask 查 sys_sms_log 未发批次 → 金桐 WebService 发短信
门禁/刷卡事件
→ 海康平台事件 → 回调 IBMS 接口(getHKRecord/getHKCloseDoor)→ 写 MongoDB 开门/关门记录 → 超时未关门告警(doorCheckTask)
6. 定时任务体系(ibms-job,Quartz)
周期表达式、目标 Bean/方法均配置在 sys_job 表;任务本体只负责通过 Feign 驱动下游服务。与设备相关的任务:
| 任务 Bean | 作用 | 关联链路 |
|---|---|---|
sensorTask |
轮询温湿度传感器取数 | device-service /sensorTask |
smokeParams |
轮询烟感/红外状态 | device-service /smokeSensorTask |
lightStatusTask |
轮询 8 路灯光状态写 Redis light_status |
device-service /searchStatus |
doorStatusTask |
轮询海康门禁状态写 Redis door_status |
business 查 /api/acs/v1/door/states |
doorCheckTask |
长时间开门告警(比对 Mongo 开关门记录) | business + Mongo |
rvscanDeviceTask / norvscanDeviceTask |
实时/非实时设备故障巡检 | device-service + t_device_breakdown |
sceneCheckTask |
开/评标时间 → 生成 Quartz 场景触发 | equipment(灯光开关/门禁开关) |
biddingRecordTask / biddingPushTask / biddingMonitorTask |
开标信息同步 + 推信息屏/监控屏 | 海螺拉取 + WebSocket |
screenTask |
小屏内容推送 | WebSocket |
cardRecordTask |
每日考勤数据整理 | Oracle |
smsTask |
设备故障短信补发 | sys_sms_log + 金桐 WS |
zsPrometheusMonitorTask |
服务器 Down 告警推企业微信 | Prometheus |
场景联动示例:某开标室到"开标时刻+10 分钟"自动开灯、评标结束自动关灯/开关门------
equipment的checkScene()将规则换算为 cron 写入t_scene_timing,到点由DeviceJob经 Feign 分别驱动灯光(UDP)与门禁(Artemis)。