在开始技术对接前,必须完成以下三项准备工作,确保后续流程顺畅。
主流的档案库房安防系统(如海康威视、大华、宇视等)通常提供以下接口,请向设备供应商或查阅设备管理后台确认:
操作:登录安防设备管理后台,在【网络设置】或【系统配置】中查找“开放平台”、“API开关”、“SDK下载”等选项,记录下IP地址、端口、协议类型及所需的账号密码(通常是设备管理员账号)。
你需要一个独立的测试环境,避免影响生产系统。
操作:将安防设备IP设置为静态IP(如192.168.1.100),在开发机上使用`ping 192.168.1.100`命令测试连通性。
联系设备供应商获取以下必需材料,缺一不可:
这是最常见且跨平台的对接方式。以下以获取监控点列表和订阅报警事件为例。
海康ISAPI使用Digest认证。构造认证请求获取会话。
操作:使用Postman发送以下请求:
请求方法:GET
URL: http://192.168.1.100/ISAPI/System/deviceInfo
认证类型:Digest Auth
用户名:admin
密码:设备管理员密码
成功响应(状态码200)的XML body中包含设备信息,同时Postman会自动管理本次会话的Cookie。在代码中,你需要使用支持Digest认证的HTTP客户端库(如Python的`requests`)并保持会话。
import requests
from requests.auth import HTTPDigestAuth
url = 'http://192.168.1.100/ISAPI/System/deviceInfo'
auth = HTTPDigestAuth('admin', 'your_password')
session = requests.Session()
response = session.get(url, auth=auth)
if response.status_code == 200:
print("认证成功,会话已建立")
print(response.text)
获取所有视频输入通道的ID和名称,用于后续关联。
操作:在已有的会话中,调用以下接口:
请求方法:GET
URL: http://192.168.1.100/ISAPI/ContentMgmt/InputProxy/channels

channels_url = 'http://192.168.1.100/ISAPI/ContentMgmt/InputProxy/channels'
channels_resp = session.get(channels_url, auth=auth)
解析返回的XML,提取channelID和name字段
实现安防事件(如烟感报警、入侵检测)的实时接收。
操作:创建HTTP长轮询订阅。在你的业务服务器上准备一个用于接收事件通知的URL(如`http://你的服务器IP:8080/event/receive`),并确保该地址能被安防设备访问(可能需要端口映射)。向设备发送订阅请求:
请求方法:PUT
URL: http://192.168.1.100/ISAPI/Event/notification/httpHosts/subscriptions
请求头:Content-Type: application/xml
请求体(XML):
1
http://你的服务器IP:8080/event/receive
HTTP
XML
1,2,3
发送此请求后,设备会将报警事件以HTTP POST的XML格式推送到你指定的URL。你的接收服务需要解析XML,提取`eventType`、`channelID`、`dateTime`等关键字段,并立即处理。
当需要深度控制(如云台控制、视频流获取)时,需使用SDK。
操作:以海康威视HCNetSDK为例,在C项目中引用`CHCNetSDK.dll`和`HCNetSDK.cs`封装类。
// 1. 初始化SDK
bool initSuccess = CHCNetSDK.NET_DVR_Init();
if (!initSuccess) { Console.WriteLine("SDK初始化失败,错误码:" + CHCNetSDK.NET_DVR_GetLastError()); }
// 2. 设置连接超时与重连参数
CHCNetSDK.NET_DVR_SetConnectTime(3000, 1); // 超时3秒,重试1次
CHCNetSDK.NET_DVR_SetReconnect(10000, true); // 重连间隔10秒
// 3. 设备登录参数结构体
CHCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V30();
int userId = CHCNetSDK.NET_DVR_Login_V30("192.168.1.100", 8000, "admin", "your_password", ref deviceInfo);
if (userId < 0)
{
Console.WriteLine("登录失败,错误码:" + CHCNetSDK.NET_DVR_GetLastError());
}
else
{
Console.WriteLine("登录成功,用户ID:" + userId);
// 保存userId,用于后续所有操作
}
这是SDK对接的核心,用于接收设备主动上报的各类报警信号。
操作:
// 1. 设置报警回调函数(必须在主线程中设置)
CHCNetSDK.MSGCallBack_V31 msgCallback = new CHCNetSDK.MSGCallBack_V31(MessageCallback);
bool setCallbackSuccess = CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(msgCallback, IntPtr.Zero);
// 2. 报警布防
CHCNetSDK.NET_DVR_SETUPALARM_PARAM setupAlarmParam = new CHCNetSDK.NET_DVR_SETUPALARM_PARAM();
setupAlarmParam.dwSize = (uint)Marshal.SizeOf(setupAlarmParam);
setupAlarmParam.byLevel = 1; // 布防等级
setupAlarmParam.byAlarmInfoType = 1; // 报警信息类型
int lHandle = CHCNetSDK.NET_DVR_SetupAlarmChan_V41(userId, ref setupAlarmParam);
if (lHandle < 0)
{
Console.WriteLine("布防失败,错误码:" + CHCNetSDK.NET_DVR_GetLastError());
}
// 3. 回调函数实现(处理报警)
public static void MessageCallback(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
{
switch (lCommand)
{
case CHCNetSDK.COMM_ALARM_V30: // 普通报警
CHCNetSDK.NET_DVR_ALARMINFO_V30 alarmInfo = (CHCNetSDK.NET_DVR_ALARMINFO_V30)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_ALARMINFO_V30));
int channel = alarmInfo.dwChannel; // 报警通道号
int alarmType = alarmInfo.dwAlarmType; // 报警类型,如0x00000008表示移动侦测
DateTime time = ConvertAlarmTime(alarmInfo.dwYear, alarmInfo.dwMonth, alarmInfo.dwDay, alarmInfo.dwHour, alarmInfo.dwMinute, alarmInfo.dwSecond);
// 将报警信息(channel, alarmType, time)写入你的业务数据库或消息队列
break;
// 可添加其他COMMAND的处理
}
}
关键细节:回调函数必须快速处理并返回,避免阻塞。建议将报警信息推入内存队列(如ConcurrentQueue),由后台工作线程消费并持久化。
无论通过API还是SDK接收数据,都应转换为内部统一格式。
public class SecurityEvent
{
public string EventId { get; set; } // GUID生成
public string SourceDeviceId { get; set; } // 设备IP或SN
public int ChannelNo { get; set; } // 通道号
public string EventType { get; set; } // 标准化类型:如"SmokeAlarm", "Intrusion"
public DateTime EventTime { get; set; } // UTC时间
public DateTime ReceiveTime { get; set; } // 系统接收时间
public string Description { get; set; } // 原始描述或转换后描述
public int Severity { get; set; } // 严重等级 1-5
}
将标准化后的事件分发到不同业务处理单元。
操作:使用一个轻量级消息队列(如RabbitMQ)解耦。事件接收服务作为Producer,将`SecurityEvent`对象序列化为JSON后发布到`security.event`交换器。消费端(存储服务、告警服务、档案系统对接服务)分别绑定队列进行消费。
部署后,请逐项验证以确保对接成功。
完成以上所有步骤,你的档案库房安防系统对接即告完成,可以实现安防事件的实时、可靠采集与业务联动。