菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
315
0

EasyNVR网页摄像机无插件H5、谷歌Chrome直播方案-Onvif(一)使用Onvif协议进行设备发现以及指定设备信息探测

原创
05/13 14:22
阅读数 59415

背景分析

众所周知,EasyNVR不拘泥、不受限于摄像机的品牌厂商及其配套平台,只要是网络监控摄像机IPC、硬盘录像机NVR、且设备支持标准的RTSP/Onvif协议,都可以接入实时视频流进入EasyNVR系统进行直播、录像、检索与回放服务。关于EasyNVR,可以移步基于EasyNVR实现RTSP/Onvif监控摄像头Web无插件化直播监控具体了解。同时EasyNVR支持使用onvif协议进行设备发现、云台控制、onvif地址获取等功能。

本篇博文着重对EasyNVR如何进行设备发现进行说明

1.准备阶段

首先,我们要了解Onvif协议(https://www.onvif.org/),关于如何使用gsoap进行onvif客户端的开发前文已经探讨,gsoap的onvif框架生成请自行google。Onvif协议的功能有很多,本文只探讨安防监控直播常用的几种功能。

2.发现原理

Onvif协议要求实现Onvif协议服务的设备支持设备发现以及设备探测,也就是discovery和probe。discovery,客户端向网段内的组播地址为239.255.255.250,端口为3702发送广播消息,等待网内Onvif协议设备响应。响应消息的设备会返回自己的IP、UUID、EP Address、Type等,最重要的会返回设备的Device Service Address,格式如: http://192.168.1.2:8080/onvif/devices ,此地址就是为设备提供Onvif服务的服务地址,我们需要使用此地址进行其他的操作。

  • 使用gsoap进行discover devices

    SOAP_ENV__Header header;
    soap_default_SOAP_ENV__Header(soap_, &header);

    header.wsa__MessageID = const_cast<char*>(soap_wsa_rand_uuid(soap_));
    header.wsa__To = "urn:schemas-xmlsoap-org:ws:2005:04:discovery";
    header.wsa__Action = "http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe";
    soap_->header = &header;

    wsdd__ScopesType scopesType;
    soap_default_wsdd__ScopesType(soap_, &scopesType);
    scopesType.__item = "";
    wsdd__ProbeType probeType;
    soap_default_wsdd__ProbeType(soap_, &probeType);
    probeType.Scopes = &scopesType;
    probeType.Types = "";

    __wsdd__ProbeMatches probeMatches;
    int result = soap_send___wsdd__Probe(soap_, "soap.udp://239.255.255.250:3702", NULL, &probeType);
    if (result == SOAP_OK)
    {
	  do
	{
		result = soap_recv___wsdd__ProbeMatches(soap_, &probeMatches);
		if (result == SOAP_OK)
		{
			//处理接收到的响应消息,提取设备信息
			//这里我们通常需要IP、Device Service Address
			//IP: soap_->ip
			//Address: probeMatches.wsdd__ProbeMatches->ProbeMatch->XAddrs 
		}
		else
		{
			break;
		}
	} while (true);
    }


3.想要更多

上述操作我们可以发现到统一网段内的设备,或者可以广播到的设备,但是,一旦我们出现了跨网段无法广播到的设备,我们如何进行设备信息获取呢?

  • 首先,我们需要知道这个设备的IP地址,否则还是无从下手,如果你不知道,无力继续…

  • 在知道设备的IP地址时,同理,我们可以向此设备进行探测,也就是我们说的probe

目前能查到的说明Onvif如何获取指定设备信息的,估计也只有我这一篇了


    SOAP_ENV__Header header;
    soap_default_SOAP_ENV__Header(soap_, &header);

    header.wsa__MessageID = const_cast<char*>(soap_wsa_rand_uuid(soap_));
    header.wsa__To = "urn:schemas-xmlsoap-org:ws:2005:04:discovery";
    header.wsa__Action = "http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe";
    soap_->header = &header;

    wsdd__ScopesType scopesType;
    soap_default_wsdd__ScopesType(soap_, &scopesType);
    scopesType.__item = "";
    wsdd__ProbeType probeType;
    soap_default_wsdd__ProbeType(soap_, &probeType);
    probeType.Scopes = &scopesType;
    probeType.Types = "";

    __wsdd__ProbeMatches probeMatches;
    std::string soapAddress(Format("soap.udp://%s:3702", host));
    if (soap_send___wsdd__Probe(soap_, soapAddress.c_str(), NULL, &probeType) == SOAP_OK)
    {
	    if (soap_recv___wsdd__ProbeMatches(soap_, &probeMatches) == SOAP_OK)
		//Address: probeMatches.wsdd__ProbeMatches->ProbeMatch->XAddrs
    }

EasyNVS云管理平台(免费使用)

EasyNVS云管理平台是新一代基于创新的超融合和技术构建,具备完整的视频流媒体服务能力和运维管理服务能力的云架构平台,可将分布在不同区域和网络环境下的多套EasyNVR设备,统一接口进行登记和管理,借助云端的宽带资源解决单路设备在云直播中多路分发观看所需的上行宽带问题,及分布式存储在云端的回放问题。

客户端通过EasyNVS云管理平台上的EasyNVR列表以及每个网络摄像头的在线状态和快照,获取对应摄像头的视频流数据远程运维,同时实现按需直播,降低网络宽带及服务器压力。

EasyNVS

EasyNVR应用场景

EasyNVR可以说已经成为国内视频互联网化基础建设的排头兵,几乎各个民生行业都已经有了EasyNVR视频能力输出的身影,EasyNVR多年服务于各行各业视频基础建设,EasyNVR的可靠性、完整性、稳定性已经受到了业界的广泛认可!

EasyNVR稳定可靠
EasyNVR场景一

平安工地

EasyNVR场景二

智慧校园

关于EasyNVR

EasyNVR是一款拥有完整、自主、可控知识产权,同时又能够具备软硬一体功能的安防互联网化流媒体服务器,能够通过简单的网络摄像机通道配置,将传统监控行业里面的高清网络摄像机IP Camera、NVR等具有RTSP、Onvif协议输出的设备接入到EasyNVR,EasyNVR能够将这些视频源的音视频数据进行拉取,转换为RTMP/HLS,进行全平台终端H5直播(Web、Android、iOS),并且EasyNVR能够将视频源的直播数据对接到第三方CDN网络,实现互联网级别的直播分发。详情可访问EasyNVR官网:http://www.easynvr.com

发表评论

0/200
315 点赞
0 评论
收藏