如何使用C#开发ONVIF中间件以调用API对接第三方系统
C# 调用ONVIF API对接第三方系统实现方案
前期准备
- 提前确认目标ONVIF设备支持的协议版本,优先匹配ONVIF Profile S/Profile T等通用标准,避免出现接口不兼容的情况
- 项目依赖可直接通过NuGet安装ONVIF相关封装库,也可以手动添加WCF服务引用,服务地址格式为
http://{设备IP}/onvif/device_service - 提前申请设备的有效鉴权账号密码,绝大多数ONVIF业务接口都需要WS-UsernameToken鉴权才可正常调用
核心实现流程
1. 设备发现与鉴权
首先通过WS-Discovery协议扫描局域网内的ONVIF设备,示例代码如下:
// 初始化发现客户端 var discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint()); // 扫描ONVIF设备,设置超时时间可根据需求调整 var findResult = discoveryClient.Find(new FindCriteria(typeof(Device)) { Duration = TimeSpan.FromSeconds(3) }); foreach (var endpointMetadata in findResult.Endpoints) { string deviceServiceAddr = endpointMetadata.Address.Uri.ToString(); // 后续用该地址初始化设备服务客户端 }
鉴权逻辑需要自行实现WS-UsernameToken规范:生成随机nonce、当前UTC时间戳,将nonce、时间戳、明文密码拼接后做SHA1哈希,再转Base64格式,最终拼接到请求头中。注意本地时间和设备时间误差不能超过5分钟,否则会被设备拒绝请求,可以先调用GetSystemDateAndTime接口获取设备时间再生成鉴权信息。
2. 常用业务接口调用
根据你的业务需求选择对应接口调用即可,常见场景示例:
- 拉取设备基础信息:调用
GetDeviceInformation接口,可获取设备厂商、型号、序列号、固件版本等基础字段 - 获取媒体流地址:调用
GetStreamUri接口,传入对应的媒体配置token,即可获取RTSP/HTTP格式的直播流地址 - 拉取事件消息:如果需要获取移动侦测、遮挡告警、IO触发等设备事件,可调用
CreatePullPointSubscription创建订阅,定期拉取事件数据
3. 第三方系统对接
拿到ONVIF接口数据后,按以下步骤对接即可:
- 先开发数据转换层,将ONVIF接口返回的异构数据统一转换为第三方系统要求的字段格式,比如把ONVIF返回的
Model字段映射为第三方系统约定的device_model字段 - 根据第三方系统的对接规范选择数据上报方式:如果第三方提供HTTP接口,直接用
HttpClient推送格式化后的JSON/XML数据;如果是MQTT协议,可引入MQTTnet等客户端库上报数据 - 新增异常重试机制,接口调用失败、数据推送失败时按指数退避策略重试3-5次,必要时做本地数据缓存,避免数据丢失
常见问题排查
- 调用接口返回401:首先确认账号密码是否正确,其次检查账号是否有对应接口的访问权限,部分设备的配置类、事件类接口需要管理员权限才可调用
- 流地址无法访问:检查部署服务的服务器和ONVIF设备的网络是否互通,部分设备需要单独开启RTSP访问权限、关闭音视频加密才可正常拉流
- 设备发现不到:检查服务器和设备是否在同一个局域网内,UDP 3702端口是否被防火墙拦截
内容的提问来源于stack exchange,提问作者ogi3538
相关产品推荐
相关产品推荐

