gsoap2.8.11实现onvif discover详细教程
- 格式:doc
- 大小:272.00 KB
- 文档页数:6
gsoap用户手册gSOAP是一个用于开发Web服务和XML数据处理的开源工具包。
它支持多种编程语言,包括C和C++,并提供了丰富的功能和工具来简化Web服务的开发和集成。
gSOAP用户手册是一个详细的文档,涵盖了gSOAP工具包的安装、配置、使用和高级特性等方面的内容。
用户手册通常包括以下内容:1. 安装指南,用户手册会提供安装gSOAP工具包的详细步骤,包括下载源代码、编译安装和配置环境等内容。
这部分内容通常会针对不同的操作系统和开发环境进行说明。
2. 快速入门,用户手册会介绍如何快速上手使用gSOAP工具包,包括创建一个简单的Web服务、生成客户端代码、编译和部署等内容。
这部分内容通常会包括示例代码和详细的步骤说明。
3. gSOAP基础,用户手册会介绍gSOAP工具包的基本概念和核心功能,包括如何定义和发布Web服务、如何处理XML数据、如何进行SOAP通信等内容。
这部分内容通常会涵盖gSOAP工具包的核心API和使用方法。
4. 高级特性,用户手册会介绍gSOAP工具包的高级特性和扩展功能,包括如何处理安全性、如何进行性能优化、如何集成其他协议等内容。
这部分内容通常会提供一些实际的应用场景和最佳实践。
5. 参考资料,用户手册通常会包括一些附录和参考资料,如API参考、配置文件说明、常见问题解答等内容,以方便开发者查阅和深入理解gSOAP工具包。
总的来说,gSOAP用户手册是开发者学习和使用gSOAP工具包的重要参考资料,它提供了全面而详细的内容,帮助开发者快速上手并深入理解gSOAP工具包的各项功能和特性。
希望这些信息能够对你有所帮助。
ONVIF测试操作说明ONVIF Device Manager是第三方测试软件,用于测试IPC是否支持NVR,同时可对IPC进行配置。
在进行ONVIF测试前,请仔细阅读一下注意事项:【1】如果您使用SPV/TKV系列相机,固件版本须在v1.2.4以上;【2】相机须升级ONVIF固件;【3】如果您需要升级相机固件和ONVIF固件,请注意:●SPV系列相机,先升级相机固件,再升级ONVIF固件,每升级一个固件都需要重启相机。
●TKV系列相机,先升级相机固件,在升级ONVIF固件,升级完标准固件后可直接升级ONVIF 固件,最后重启相机。
ONVIF测试具体操作步骤如下:(1)安装ONVIF Device Manager软件后,双击图标打开软件。
(2)搜索设备软件会自动搜索设备,或者点击“Refresh”按钮。
成功搜索设备如下图。
(3)创建用户点击下图中的图标,添加用户。
弹出如下界面创建用户(4)常用功能i.时间设置点击“Time settings”进入时间设置。
时区:中国CST-8时间:与电脑时间同步;网络时间校时;手动设置。
ii.网络设置点击“Network settings”进入网络设置,可设置相机IP、NTP服务器IP。
iii.用户管理点击“User management”进入用户管理,可创建和删除用户。
点击“Create”创建新用户。
设置用户名、密码、权限。
创建的新用户权限只能选择Operator和User。
iv.查看实时视频点击设备,查看Live video,显示如下。
v.视频流点击“Video streaming”进入视频流,可查看实时视频,设置相机分辨率、帧频、码率、图片质量。
vi.图像设置点击“Imaging settings”进入图像设置,可以设置相机亮度、饱和度、白平衡、曝光模式、曝光时间范围、曝光亮度范围、曝光光圈。
onvif实现功能:和经验1) 设备匹配probe消息SOAP_FMAC5 int SOAP_FMAC6 soap_serve___dndl__Probe(struct soap *soap){….把soap_put_d__ProbeMatchesType(soap, &dn__ProbeResponse, "dn:ProbeResponse", NULL)改成soap_put_d__ProbeMatchesType(soap, &dn__ProbeResponse, "d:ProbeMatches", NULL) ….}2) 由analytics.wsdl ptz.wsdl devicemgmt.wsdl media.wsdl event.wsdl 生成头文件,在头文件中要加#import "import/wsse.h" ,为了实现安全接口3) 安全验证用户SOAP_FMAC3 int SOAP_FMAC4 soap_out_SOAP_ENV__Header(struct soap *soap, const char *tag, int id, const struct SOAP_ENV__Header *a, const char *type){….soap->mustUnderstand = 1;if (soap_out_PointerTo_wsse__Security(soap, "wsse:Security", -1, &a->wsse__Security, "")) return soap->error;改为soap->mustUnderstand = 0;if (soap_out_PointerTo_wsse__Security(soap, "wsse:Security", -1, &a->wsse__Security, "")) return soap->error;….}4) 生成.c文件D:\onvif>soapcpp2 -2 -c -x -L -pws -I D:\gsoap-2.8\gsoap;d:\gsoap-2.8/gsoap/import/ ws.h其中-2参数是选择onvif 1.2 版本, 如果选择-1消息通知就无法被onvif测试工具识别5) 生成.c后缀名的文件全部改成.cpp文件6) onvif要生成客户和服务端, 客户端主要是用来发送hello消息和消息通知接口7) 生成头文件D:\onvif>wsdl2h.exe –c -o ws.h -t typemap.dat -s analytics.wsdl ptz.wsdl devicemgmt.wsdl media.wsdl event.wsdl remotediscovery.wsdl imaging.wsdl要在ws.h文件中增加#import "import/wsse.h" 这表明是安全接口8) soapcpp2生成数个.nsmp命名空间文件,只需要用其中一个就可以(我们使用的EventBinding.nsmap)9) 开发人员只需关注wsClient.c, wsServer.c这两个文件,可对他进行修改10) 通过wsdl2h.exe –c -o ws.h -t typemap.dat -s analytics.wsdl ptz.wsdl devicemgmt.wsdl media.wsdl event.wsdl remotediscovery.wsdl imaging.wsdl 会报错误,不影响开发.11) 设备发现的soap初试化必为下列代码soap_init1(&m_soap_entry, SOAP_IO_UDP | SOAP_XML_IGNORENS);struct ip_mreqn imreq;imreq.imr_multiaddr.s_addr =inet_addr(MULTI_GROUPID);imreq.imr_address.s_addr = htonl(INADDR_ANY);imreq.imr_ifindex= 2;m_soap_entry.version = 2;m_soap_entry.send_timeout = 3; // 1s timeoutm_soap_entry.recv_timeout = 3; // 1s timeoutif (!soap_valid_socket(soap_bind(&m_soap_entry, NULL, 3702, 100))){DEBUG_OUTPUT4("CDiscovery::Init soap_valid_socket error");}DEBUG_OUTPUT4("CDiscovery::Init soap_valid_socket success");if (setsockopt(m_soap_entry.master, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imreq, sizeof(imreq))<0){DEBUG_OUTPUT4("CDiscovery::Init setsockopt IP_ADD_MEMBERSHIP Error");}12) hello 消息发送必须为struct soap *tsoap;tsoap = soap_copy(&m_soap_entry);Hello(tsoap, endpointReference);把if (soap_connect(soap, soap_endpoint, soap_action)|| soap_envelope_begin_out(soap)|| soap_putheader(soap)|| soap_body_begin_out(soap)|| soap_put___dnrd__Hello(soap, &soap_tmp___dnrd__Hello, "-dnrd:Hello", NULL)|| soap_body_end_out(soap)|| soap_envelope_end_out(soap)|| soap_end_send(soap))return soap_closesock(soap);改为if (soap_connect(soap, NULL, soap_action)){return soap_closesock(soap);}soap_set_endpoint(soap, soap_endpoint);soap->error = SOAP_OK;struct sockaddr_in peer;peer.sin_family=AF_INET;peer.sin_port=htons(soap->port);peer.sin_addr.s_addr=inet_addr(soap->host);memcpy(&soap->peer, &peer, sizeof(sockaddr_in));soap->peerlen = sizeof(peer);if(soap_envelope_begin_out(soap)|| soap_putheader(soap)|| soap_body_begin_out(soap)|| soap_put___dnrd__Hello(soap, &soap_tmp___dnrd__Hello, "-dnrd:Hello", NULL)|| soap_body_end_out(soap)|| soap_envelope_end_out(soap)|| soap_end_send(soap))return soap_closesock(soap);13) 开发人员要实现服务端所有接口,下面是部分接口(请参考wsClient.cpp 文件SOAP_FMAC5 int SOAP_FMAC6 __dndl__Probe(struct soap*, struct d__ProbeType *dn__Probe, struct d__ProbeMatchesType *dn__ProbeResponse);SOAP_FMAC5 int SOAP_FMAC6 __dnrd__Hello(struct soap*, struct d__HelloType *dn__Hello,struct d__ResolveType *dn__HelloResponse);SOAP_FMAC5 int SOAP_FMAC6 __dnrd__Bye(struct soap*, struct d__ByeType *dn__Bye, struct d__ResolveType *dn__ByeResponse);14) 安全用户名和密码是采用openssl库和gsoap的自带的控件, 采用下列接口soap_wsse_verify_Passwordsoap_wsse_verify_Timestampsoap_wsse_get_Username15) openssl 编译tar zxvf openssl-0.9.8.tar.gzcd openssl-0.9.8./config no-asm --prefix=/opt/openssl os/compiler:/ToolChain/bin/ arm-none-linux-gnueabi-g++makemake install之后进入到/opt/openssl 拷贝头文件和库16) 通过80端口发送流首先要判断消息是onvif消息还是请求流消息, 通过MSG_PEEK来区分如果是onvif消息就走onvif信令,否则走播流通道Onvif已经实现功能设备发送hello消息设备接收hello消息设备发现匹配相应获取设备信息设置系统时间获取系统时间软件出厂默认值恢复系统重新启动获取wsdlurl获取所有能力集获取设备能力集获取事件能力集获取图象能力集获取媒体能力集获取主机名字设置主机名获取网络接口信息设置网络接口信息获取网络协议获取网关设置网关。
基于gsaop实现onvif之二 .用户验证1原理在ONVIF_WG-APG-Application_Programmer's_Guide.pdf文档中第6章描述了onvif加密方式。
Soap通信的验证机制是WS_UsernameToken,流加密的方式是HTTPS。
我们知道onvif的用户验证是基于WS_UsernameToken,而且密码是Digest而不是明文,先来看一段带有用户验证信息的消息:所谓的WS_UsernameToken加密,就是将用户名,密码,Nonce,Created都包含在了header里面。
如果将#passwordDigest换成#passwordText的话,密码就是明文的,当然onvif说了,密码是Digest。
我们知道了用户名密码,那如何验证呢?文档里面提到了获取Digest的公式:Digest = B64ENCODE( SHA1( B64DECODE( Nonce ) + Date + Password ) )2 实现现在知道了WS_UsernameToken是怎么回事,下面我们来看看如何实现验证吧。
在gsoap文档中推荐使用wsseapi的插件来实现,这肯定最方便的方法,这个很简单,看看wsse的帮助就知道了。
我不需要wsse里面的那么多冗余代码。
想用最精简的办法来实现,毕竟wsseapi里面包含了非常多的加密方式,而onvif只规定了WS_UsernameToken。
所以自己动手。
第一步,先要把用户名,密码Digest,nonce给获取到。
我们知道这些都再Header中。
soap_in_SOAP_ENV__Header 这个函数是用来反序列化(xml转成数据结构)header中信息的。
所以就在这里面干。
我们依葫芦画瓢的写了个soap_in_PointerTo_Authentication函数调用,这个函数是用来从header中将我们需要的信息提取出来的。
onvif拉流的指令全文共四篇示例,供读者参考第一篇示例:ONVIF是一个全球性的开放标准,旨在推动网络视频监控设备之间的互操作性。
ONVIF为监控设备制造商提供了一种通用的协议,使得不同厂家的设备可以无缝连接和互相通信。
在使用ONVIF协议进行视频流拉取时,我们可以通过简单的指令来实现。
通过ONVIF协议进行视频流拉取的主要步骤如下:1. 获取设备的基本信息:我们需要获取监控摄像头的基本信息,包括其IP地址、端口号、用户名和密码等。
这些信息可以通过设备的网络界面或者设备厂商提供的文档来获取。
2. 获取设备的能力信息:接下来,我们需要获取设备的能力信息,以确定设备是否支持ONVIF协议以及支持的功能。
这些信息通常可以通过发送GetCapabilities命令来获取。
4. 拉取视频流:我们可以通过发送GetStreamUri命令来拉取视频流。
在该命令中,我们需要指定要拉取的视频流的Profile Token,以及要拉取视频流的传输协议(如RTSP、HTTP等)和传输方式(如UDP、TCP等)。
```pythonimport zeep# 设置设备的基本信息ip_address = '192.168.1.100'port = 8000username = 'admin'password = 'admin'# 创建设备的服务地址service_url =f'http://{ip_address}:{port}/onvif/device_service' # 获取设备的能力信息capabilities = device_service.GetCapabilities()# 获取视频流信息media_service_url = capabilities['Media']['XAddr'] media_service = zeep.Client(media_service_url)profiles = media_service.GetProfiles()# 选择要拉取视频流的Profile Tokenprofile_token = profiles[0]['token']print(f'Video stream URI: {stream_uri}')```通过以上代码,我们可以实现使用ONVIF协议拉取监控摄像头视频流的功能。
序ONVIF协议致力于通过全球性的开放接口标准来推进网络视频在安防市场的应用,这一接口标准将确保不同厂商生产的网络视频产品具有互通性。
2008年11月,论坛正式发布了ONVIF协议第一版规范——ONVIF协议核心规范Onvif协议1.0版,后续又推出Onvif 协议2.0版本。
随着视频监控的网络化应用,产业链的分工将越来越细。
有些厂商专门做网络摄像机,有些厂商专门做DVS,有些厂商则可能专门做平台等,然后通过集成商进行集成,提供给最终客户。
这种产业合作模式,已经迫切的需要行业提供越来越标准化的接口平台。
本文用于指导NVR及软件平台解决方案中的Onvif协议对接,详细介绍了Onvif协议、WSDL、SOAP等基本概念,讲述开发的流程及各种文件的来源,为开发及维护人员提供理论支持。
目录序 (1)目录 (2)第1章基本概念 (3)Onvif协议协议规范 (3)Web Service (3)WSDL (4)SOAP (4)gSOAP工具 (4)第2章组网框架 (6)第3章开发流程 (7)3.1 获取WSDL文件 (7)3.2 通过gSOAP工具生成C/C++文件 (8)3.2.1 gSOAP工具说明 (8)3.2.2 使用wsdl2h程序生成头文件 (9)3.2.3 使用soapcpp2.exe生成源文件 (10)3.3 开发业务逻辑代码 (11)3.4 编译发布 (12)第4章测试工具 (13)第5章相关资料 (15)第1章基本概念Onvif协议协议规范Onvif协议规范描述了网络视频的模型、接口、数据类型以及数据交互的模式,并复用了一些现有的标准,如WS系列标准等。
规范的目标是实现一个网络视频框架协议,使不同厂商所生产的网络视频产品(包括摄录前端、录像设备等)完全互通。
规范中设备管理和控制部分所定义的接口均以Web Services的形式提供。
Onvif协议规范涵盖了完全的XML及WSDL的定义。
每一个支持Onvif协议规范的终端设备均须提供与功能相应的Web Service。
使用gsoap规避和修改onvif标准类型结构的解析使用gsoap规避和修改onvif标准类型结构的解析在软件开发和集成过程中,我们常常会遇到需要与标准接口进行交互的情况。
然而,有时这些标准接口的数据结构并不完全符合我们的需求,需要对其进行一定的规避和修改。
特别是在使用onvif标准类型结构时,可能出现一些解析上的困难,这时候我们就可以考虑使用gsoap来规避和修改这些结构,以便更好地满足我们的实际需求。
让我们来了解一下gsoap和onvif标准类型结构的基本概念。
1. 什么是gsoap?gsoap是一种用于开发基于web服务的软件的工具。
它可以帮助我们在C/C++中快速创建和部署web服务,同时支持对复杂数据类型进行序列化和反序列化。
通过gsoap,我们可以轻松地与各种标准和定制的接口进行交互,包括onvif标准接口。
2. 什么是onvif标准类型结构?onvif是一种用于网络视频设备的开放性标准,它定义了一系列用于视频监控设备之间通信的接口和数据结构。
在onvif标准中,包含了各种类型的数据结构,用于描述设备的属性、状态和控制信息。
然而,由于不同厂商的设备可能存在一定差异,有时候我们需要对onvif标准类型结构进行一定的规避和修改,以适应实际情况。
接下来,让我们来看看如何使用gsoap来规避和修改onvif标准类型结构。
3. 使用gsoap规避onvif标准类型结构在使用gsoap与onvif标准接口进行交互时,我们可能会遇到一些数据结构无法直接满足我们的需求的情况。
onvif的某个数据结构可能包含了我们不需要的字段,或者缺少我们需要的字段。
这时,我们可以借助gsoap的序列化和反序列化功能,对这些数据结构进行规避。
通过定义一个新的数据结构,并使用gsoap的序列化和反序列化功能,我们可以实现从原始的onvif数据结构到我们需要的数据结构的转换。
在这个过程中,我们可以对字段进行筛选、重命名和重组,以便更好地满足我们的实际需求。
gsoap实现onvif步骤
gsoap是一种基于C/C++的SOAP开发工具,可以用于实现ONVIF 协议。
以下是使用gsoap实现ONVIF的步骤:
1. 下载gsoap的最新版本,并解压缩到本地目录中。
2. 通过WSDL文件生成C/C++的客户端和服务器代码。
可以使用命令行工具wsdl2h来生成头文件,然后使用soapcpp2生成C/C++代码。
3. 在生成的代码中,将所有的soap_call_xxx函数和soap_xxx 函数替换为gsoap提供的soap_call_nsx_xxx和soap_nsx_xxx函数。
其中,nsx是命名空间的前缀,可以根据实际情况进行修改。
4. 在代码中添加gsoap的头文件,并链接gsoap库文件。
5. 在客户端代码中,使用soap_init函数初始化SOAP环境,使用soap_free函数释放SOAP环境。
在服务器代码中,使用soap_serve 函数启动SOAP服务。
6. 在客户端代码中,使用soap_call_nsx_xxx函数调用ONVIF 协议中定义的各种操作。
在服务器代码中,实现ONVIF协议中定义的各种操作。
7. 调试代码时,可以使用soap_print_fault函数打印出SOAP 错误信息。
8. 在代码中实现必要的认证、加密等安全机制,以保护数据的安全性和完整性。
以上就是使用gsoap实现ONVIF的步骤。
需要注意的是,gsoap
的使用需要一定的SOAP和C/C++编程基础,建议先学习相关知识再进行实践。
Onvif网关安装配置使用说明一、安装配置1、部署Onvif设备接入网关a.获取安装包(以mvp_vgate2100_D10V100_alpha4.zip为例),在windows机器(win7或2008)上任意目录下解压缩b.修改配置文件需要修改解压缩目录下的config.xml文件<?xml version="1.0" encoding="UTF-8" ?><CONFIG Version="1.0"><ServerInfo><ServerID>TEMOBI2012</ServerID><ServerType>11</ServerType><ServerName>ONVIF设备接入网关服务器</ServerName><ServerIP><innerAddress>127.0.0.1</innerAddress> ----onvif网关所在的内网ip<outerAddress>192.168.1.105</outerAddress> --onvif网关的外网IP 也可以配置成域名</ServerIP><ServerPort>8888</ServerPort> ----onvif网关本地服务器端口</ServerInfo><CoreServerInfo><ServerIP>183.230.40.72</ServerIP> ----消息中心的ip地址,如果网关与消息中心在同一网段此处可以配置为内网地址,否则需要配置为外网地址<ServerPort>8860</ServerPort> ---消息中心ICE监听端口上面这两个配置在消息中心服务器上/home/sc-vcp/config/ice.properties文件中可以查看到,如“ProtocolModule4ICE.Endpoints=tcp -h 192.168.44.2 -p 8860”</CoreServerInfo><TransInfo><Enable>false</Enable> ---连接转码服务器的开关,默认为false,启用实时转码时需要修改为true,重启网关服务器之后生效<ServerIP>192.168.3.177</ServerIP> ----转码服务器的ip地址<ServerPort>8860</ServerPort> --转码服务器的服务器端口<VEPolicy><ID>3G_CIF</ID> --转码策略,需要与转码服务器提供的策略名称一致<ID>4G_D1</ID></VEPolicy></TransInfo></CONFIG>二、管理后台添加转码服务器信息使用admin或其他管理员账号登陆管理后台,依次点击“基础数据管理>服务器管理”,新增网关服务器信息。
感谢
以下教程基本是(沙漠之鸽)给予我的指导的整理而来,他非常耐心的提供了帮助,也是受于他的分享精神,所以写下了这遍教程。
前言:
做onvif的过程十分痛苦,什么wsdl,soap,webserver,全部都是没有接触过的,还好有gsoap可以用,在网上和群共享里面只有2.8.3版本实现过程,而且比较麻烦的是要自己实现probe所有细节。
在2.8.11中,wsddapi插件为我们设计好了wsdd的接口,我们要做的就是填充brobe的matches信息就可以了。
简化了开发过程,也不必用高手们做的typemap 文件,因为这些看不懂的文件让我们对做出的程序毫无信心。
生成.h文件。
我们需要从onvif官网下载wsdl文件,和onvif.xsd文件。
然后生成.h文件
wsdl2h -sck -t /opt/nfshost/gsoap-2.8/gsoap/typemap.dat -o onvif.h
analytics.wsdl analyticsdevice.wsdl devicemgmt.wsdl display.wsdl event.wsdl imaging.wsdl media.wsdl ptz.wsdl receiver.wsdl recording.wsdl
remotediscovery.wsdl replay.wsdl search.wsdl deviceio.wsdl
这一步你会发现生成速度非常慢,还会提示找不到onvif.xsd,速度慢得原因是wsdl2h会根据wsdl中引用去网上下载一下xsd和wsdl文件,我们可以将这些文件下载到本地,然后修改wsdl中的路径。
修改之前schemaLocation是一个url,如果你放的和你onvif的wsdl文件相同的目录中,这样写就ok了,如果不是,可以写上相对路径。
修改生成的onvif.h文件
增加一句#import "wsse.h",用于身份验证,具体怎么用还不知道。
求帮助
生成代码
soapcpp2 -2 -L -c -x -d ../ -I /opt/nfshost/gsoap-2.8/gsoap:/opt/nfshost/gsoap-
2.8/gsoap/import/:/opt/nfshost/gsoap-2.8/gsoap/custom/ onvif.h
生成的过程中会出现SOAP_ENV__Fault重复定义,注视掉wsa5.h中得内容就行了
好了,我们的代码已经生成。
每个文件具体作用请见查看文档。
、
将plugin中得文件拷贝到工程、
gsoap/dom.c
gsoap/stdsoap2.c
gsoap/stdsoap2.h
gsoap/custom/duration.c
gsoap/plugin/mecevp.c
gsoap/plugin/mecevp.h
gsoap/plugin/smdevp.c
gsoap/plugin/smdevp.h
gsoap/plugin/threads.c
gsoap/plugin/threads.h
gsoap/plugin/wsaapi.c
gsoap/plugin/wsaapi.h
gsoap/plugin/wsseapi.c
gsoap/plugin/wsseapi.h
gsoap/plugin/wsddapi.c
gsoap/plugin/ wsddapi.h
现在我们的webserver中有了这些文件了。
实现接口
Gsoap在soapStub.h中为我们定义了的函数,我们必须要实现,当然不是要一下子写完,你可以写个空的函数,新建一个c文件,将函数实现。
记住一点,WSDD域的方法已经在wsddapi实现。
__wsdd_开头的函数不需要实现。
Wsddapi需要你实现一些event接口。
这个接口是以上函数用来获取信息的,只要将信息填充就可以了。
我的probe是这样实现的,当然是最初步的实验,没有信息获取过程
soap_wsdd_init_ProbeMatches(soap,matches);
soap_wsdd_add_ProbeMatch(soap,matches,
"urn:uuid:464A4854-4656-5242-4530-313035394100",
"dn:NetworkVideoTransmitter",
"onvif:///type/video_encoder
onvif:///type/audio_encoder onvif:///hardware/IPC-model onvif:///name/IPC-model",
NULL,
"http://192.168.20.143/onvif/device_service",1);
以上两行就可以实现probe,是不是很easy啊。
Wsddapi文件此时还是编译不过去的,因为默认使用的是wsa5,而wsdd定义的是wsa,所以我们修改soapStu.h
注释掉soap_wsa_2005,此时,我们的webserver可以编译通过了。
监听组播信息
当然,我们还需要监听组播消息。
我们此时调用wsaapi中得listen方法就可以了。
编译
做完以上的内容,我们的onvif框架已经完成,现在开始编译咯
编译的时候记得加上一下参数
-DWITH_OPENSSL -DWITH_DOM –DDEBUG
Run!!!
发现设备了
洪子,2012/11/8
whtc123@。