一、 系统融合的核心目标与选型准备
档案库房的核心诉求是确保纸质档案的绝对安全。传统做法是消防系统与档案管理系统独立运行,存在信息孤岛与联动迟滞风险。本方案旨在通过技术集成,实现消防报警与档案实体位置、应急调度的秒级联动,将事后补救转为事前预防与事中精准处置。
1.1 硬件与网络基础准备
确保以下硬件就位并联网:
- 消防主机:需支持标准Modbus TCP、BACnet IP或具备开放API接口的型号,如青鸟、海湾、西门子等品牌的主流网络型主机。
- 档案管理系统服务器:建议使用x86架构服务器,操作系统为Ubuntu Server 22.04 LTS或CentOS Stream 9。
- 网络交换机:需为消防主机与档案服务器划分同一VLAN,确保IP可达。禁用防火墙或配置双向放行策略。
- 智能传感器:除传统烟感、温感外,部署水浸传感器于空调下方、极早期空气采样烟雾探测器(VESDA)于珍品库房。
1.2 关键信息采集
在接线前,必须向消防系统供应商获取以下文档:
- 消防主机的IP地址、子网掩码、网关。
- 通信协议的详细说明书,包含寄存器地址表(Modbus)或对象属性表(BACnet)。
- API接口文档(如有)及授权访问密钥。
二、 消防数据采集中间件部署
这是连接消防系统与档案软件的关键桥梁,我们采用开源的Node-RED进行可视化流编排,可靠性高且易于维护。
2.1 Node-RED安装与基础配置
在档案管理系统服务器上执行以下命令:
```
sudo apt update && sudo apt install -y nodejs npm
sudo npm install -g --unsafe-perm node-red
sudo systemctl enable node-red
sudo systemctl start node-red
```
访问 http://[服务器IP]:1880 进入Node-RED管理界面。首先安装协议节点,在管理面板选择“节点管理”->“安装”,搜索并安装:
- node-red-contrib-modbus (用于Modbus TCP)
- node-red-contrib-bacnet (用于BACnet)
- node-red-dashboard (用于简易看板)
2.2 构建消防数据采集流
以下以Modbus TCP为例,创建第一个流:
- 从左侧面板拖入一个 modbus-read 节点。
- 双击该节点进行配置:
- Server Type: TCP
- Host: 填入消防主机的IP,例如
192.168.1.100
- Port: 502
- Unit ID: 1 (根据消防主机设置填写)
- Poll Rate 设置为 2000 毫秒。
- 在“Read Properties”中,根据协议文档填写。例如,1号回路烟感报警状态可能位于寄存器地址 40001,数据类型为“Discrete Input”。
- 连接一个 function 节点,编写解析函数,将寄存器值(如1)映射为具体设备(如“一楼珍品库烟感-01”)和状态(如“报警”)。
- 最后连接一个 mqtt out 节点,将格式化后的JSON数据发布到主题,如
firedetection/alarm。
关键点:必须与消防维保人员共同测试每个寄存器地址对应的实际设备,并记录成映射表。
三、 档案管理系统集成与联动逻辑实现

档案管理系统(以基于Django的开源系统为例)需要订阅消防报警消息,并触发内部业务逻辑。
3.1 消息订阅与视图层开发
在Django项目的views.py中,创建异步消息处理函数:
```
import paho.mqtt.client as mqtt
import json
from django.core.cache import cache
def on_message(client, userdata, msg):
payload = json.loads(msg.payload.decode())
device_name = payload['device']
alarm_state = payload['state']
location = payload['location'] 例如:A区-密集架-01排
1. 实时状态缓存
cache.set(f'fire_alarm_{location}', alarm_state, timeout=60)
2. 触发关联档案检索
if alarm_state == "报警":
from archive.models import ArchiveBox
根据位置检索该区域所有档案盒
related_boxes = ArchiveBox.objects.filter(storage_location__contains=location)
box_ids = list(related_boxes.values_list('id', flat_name'))
3. 生成应急调度清单
emergency_list = {
"alarm_location": location,
"time": datetime.now().isoformat(),
"priority_boxes": box_ids, 可结合档案密级进一步排序
"suggested_action": "启动气体灭火,通知安保人员前往确认"
}
存入数据库或发送到消息队列
save_emergency_list(emergency_list)
4. 实时推送(使用WebSocket)
通过Channels推送到前端监控大屏
async_to_sync(channel_layer.group_send)(
"fire_monitor",
{
"type": "fire.alarm",
"message": emergency_list
}
)
client = mqtt.Client()
client.on_message = on_message
client.connect("localhost", 1883, 60)
client.subscribe("firedetection/")
client.loop_start()
```
3.2 数据库扩展与应急清单
在档案数据库的ArchiveBox表中,确保包含以下关键字段:
```
class ArchiveBox(models.Model):
box_id = models.CharField(max_length=50, unique=True)
storage_location = models.CharField(max_length=200) 必须与消防位置映射一致
secret_level = models.CharField(max_length=10, choices=[('普通', '普通'), ('秘密', '秘密'), ('机密', '机密')])
emergency_priority = models.IntegerField(default=0) 数字越大,抢救优先级越高
... 其他原有字段
```
当报警触发时,系统自动生成的应急调度清单应包含:档案位置、盒号、密级、优先级、建议处置措施(如:优先转移机密档案)。
四、 全景监控看板与报警推送配置
4.1 可视化看板搭建
利用Node-RED Dashboard或Grafana快速构建。
- 在Node-RED中拖入dashboard系列的
gauge(仪表盘)、text(文本显示)节点。
- 将消防数据流解析后的数据连接到这些节点。
- 在
ui_group中设置一个名为“消防监控”的组。
- 部署后,通过
http://[服务器IP]:1880/ui 访问看板。
4.2 多通道报警推送
在Node-RED中并行添加以下节点,连接到报警解析流之后:
- 企业微信机器人:使用
http request节点,向机器人Webhook地址发送POST请求,内容为JSON格式的报警信息。
- 短信网关:调用如阿里云短信API,在
function节点中格式化报警内容为短信模板。
- 声光报警器联动:通过
tcp out节点向指定的IP和端口(连接报警器控制器)发送特定指令码,如ALARM_ON。
推送内容模板必须包含:报警时间、精确位置(如:3号楼2层档案库房A区)、设备类型、建议处置动作。
五、 系统联调与日常维护清单
5.1 全链路联调步骤
- 消防信号模拟:使用消防主机的测试功能,或短接某个烟感探测器,触发报警。
- 数据流验证:在Node-RED中启用Debug节点,确认能收到正确的寄存器数据变化,并完成解析。
- 业务逻辑验证:查看档案系统后台,确认应急清单已自动生成,且内容准确。
- 推送验证:检查企业微信群、接收测试手机短信,确认报警信息格式正确、接收及时。
- 恢复测试:复位消防报警,验证所有系统状态能自动恢复正常,看板状态更新。
5.2 维护与检查清单
- 每日:登录监控看板,确认所有传感器状态为“正常”;检查Node-RED流运行状态(无错误提示)。
- 每月:进行一次完整的消防测试,并核对档案系统生成的应急清单与库房实际存放情况是否100%吻合。
- 每季度:与消防维保人员共同核对一次消防设备地址与系统内映射表,确保任何设备变更已同步更新。
- 每年:审查并测试所有报警推送通道的有效性,更新相关API密钥。
通过以上步骤,即可构建一个消防与档案管理深度联动的主动防御系统,将安全隐患的响应从小时级提升至秒级,并实现抢救工作的精准化、数字化。