记录一次IBMS物联网项目的架构设计及技术栈应用

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. 设备接入的总体设计(核心机制)

现场设备对接不写死在代码里,而是**"数据库驱动 + 协议动态装载 + 轮询触发"**,这是理解整套对接方式的关键:

  1. 设备物模型 (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(上行数据主题)
  2. 动态装载协议 :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),由数据库指向加载,新增设备协议无需改主服务。

  3. 控制指令来源库表 :灯/温湿度等 MODBUS 风格指令(如 01 03 000D 0001+CRC16)由实施按厂商文档计算 CRC 后录入 t_device_command,运行期按 type 取出下发(doc/03设备服务对接/03灯光及温湿度/灯光温湿度操作命令计算.txt)。

  4. 触发方式 :ibms-job(Quartz)→ Feign 回调 ibms-device-service 的 /device/access/* HTTP 接口 → MINA session.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)。


相关推荐
水墨长天8 小时前
物联网协议 MQTT 快速开发与实践
后端·物联网
EatFans9 小时前
全栈自造Status Deck(三):桌面端上位机程序开发
物联网
调试优选官6 天前
IoT物联网系统定制落地实践:从设备接入、协议网关、平台分层到业务应用,如何做技术选型、交付验收、责任边界与长期运维成本评估及迁移安排
物联网·iot·成本分析
只睡四小时6 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
华允物联-HUAIOT6 天前
工业路由器和DTU在联网方式上的区别
物联网
wuyk5556 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
码流子6 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
XUEYUAN52126 天前
ASN 自治系统号风控:平台如何通过 IP 所属自治域批量识别代理流量
python·网络协议·http·网络安全·socks5
绿蕉6 天前
配电房的“AI听诊师”:可视化声纹局放智能巡检系统与通讯保障
物联网