松下wv-cl320是不是onvif官网协议的

36741人阅读
有了前几篇的基础,现在可以正式开始onvif的实现工作,其中一项非常重要的部分就是视频流的对接,即能够在符合onvif标准的监控客户端软件里接收到设备端NVT发来的RTSP视频流。这里,我所用的客户端软件是Onvif Device Manager v2.2。【来自http://blog.csdn.net/ghostyu】
ONVIF&Profile S Specification文档描述了Device或者说DVT和Client可以使用的一种Profile,Profile这个词在计算机领域非常常见,我们可以理解成一种方案、配置、框架等。
文档里描述了如果实现VideoStream,device和client应该具备的条件,当然如果实现文档的所有条件,就可以说该设备符合Profile S
如果单纯实现VideoStream,只需完成下列命令。
1、GetProfiles
2、GetStreamUri
填充rtsp路径,例如:rtsp://192.168.1.201/petrov.m4e
3、Media Streaming using RTSP
这里使用开源的live555,完成rtsp功能
4、GetVideoEncoderConfiguration
5、GetVideoEncoderConfigurationOptions
6、GetCapabilities
NVC为了获取DVT所支持的功能的命令
参考文档:
1、ONVIF Profile S Specification
描述ProfileS是什么样的一个东西,如何实现
2、Reference_of_ONVIF_Development_v1.01.02
Onvif DVT设计参考,指明了一条道路,但没有具体内容
3、ONVIF-Media-Service-Spec-v220
Onvif Media的说明介绍
4、http://www.onvif.org/onvif/ver20/util/operationIndex.html
onvif几乎全部命令的详细说明,非常重要。该文档告诉我们结构体成员的意义和如何填充。Onvif开发其实就是各种结构体的填充。
一、产生onvif源码框架
1、从wsdl生成C头文件
wsdl2h -o onvif.h -c -s -t .\typemap.dat http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl http://www.onvif.org/onvif/ver10/display.wsdl http://www.onvif.org/onvif/ver10/deviceio.wsdl http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl
http://www.onvif.org/onvif/ver10/receiver.wsdl http://www.onvif.org/onvif/ver10/recording.wsdl
http://www.onvif.org/onvif/ver10/search.wsdl http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl http://www.onvif.org/onvif/ver10/replay.wsdl http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl
http://www.onvif.org/onvif/ver10/schema/onvif.xsd
http://www.onvif.org/ver10/actionengine.wsdl
跟前一篇discovery唯一不同的是,这里多了很多wsdl文件,这次创建完整的onvif代码框架
2、从头文件生成源码框架
soapcpp2 -c onvif.h -x -I /root/onvif/gsoap-2.8/gsoap/import -I /root/onvif/gsoap-2.8/gsoap/产生的C文件比较庞大,最大的有十几兆,大部分的内容没有复用导致。
二、创建soap运行环境
int main(int argc, char **argv)
struct soap add_
int server_
server_udp = create_server_socket_udp();
//bind_server_udp1(server_udp);
pthread_t thrH
pthread_t thrP
//pthread_create(&thrHello,NULL,main_Hello,server_udp);
//sleep(2);
pthread_create(&thrProbe,NULL,main_Probe,server_udp);
soap_init(&add_soap);
soap_set_namespaces(&add_soap, namespaces);
if (argc & 0) {
printf(&usage: %s &server_port& \n&, argv[0]);
m = soap_bind(&add_soap, NULL, 80, 100);
if (m & 0) {
soap_print_fault(&add_soap, stderr);
fprintf(stderr, &Socket connection successful: master socket = %d\n&, m);
for (;;) {
s = soap_accept(&add_soap);
if (s & 0) {
soap_print_fault(&add_soap, stderr);
fprintf(stderr, &Socket connection successful: slave socket = %d\n&, s);
soap_serve(&add_soap);
soap_end(&add_soap);
} 注意,这里绑定了80端口,onvif使用的是http请求,然后附带xml,其实正常的是将onvif集成到web服务器中,普通的http请求有web服务器处理,onvif的http请求则有soap处理。我们这里的做法也可行,只不过onvif的访问web服务器的功能是无法使用的。
三、RTSP视频对接
1、实现GetCapabilities命令
客户端发送GetCapabilities命令来得到设备端的能力,然后依据GetCapabilities返回的结果再来进行下一步操作
在__tds__GetCapabilities函数中我们只需要填充Media部分和一些必要的即可
//想要对接RTSP视频,必须设置Media
tds__GetCapabilitiesResponse-&Capabilities-&Media = (struct tt__MediaCapabilities*)soap_malloc(soap, sizeof(struct tt__MediaCapabilities));
tds__GetCapabilitiesResponse-&Capabilities-&Media-&XAddr = (char *) soap_malloc(soap, sizeof(char) * LARGE_INFO_LENGTH);
strcpy(tds__GetCapabilitiesResponse-&Capabilities-&Media-&XAddr, _IPv4Address);
tds__GetCapabilitiesResponse-&Capabilities-&Media-&StreamingCapabilities = (struct tt__RealTimeStreamingCapabilities*)soap_malloc(soap, sizeof(struct tt__RealTimeStreamingCapabilities));
tds__GetCapabilitiesResponse-&Capabilities-&Media-&StreamingCapabilities-&RTPMulticast = (int *)soap_malloc(soap, sizeof(int));
*tds__GetCapabilitiesResponse-&Capabilities-&Media-&StreamingCapabilities-&RTPMulticast = _
tds__GetCapabilitiesResponse-&Capabilities-&Media-&StreamingCapabilities-&RTP_USCORETCP = (int *)soap_malloc(soap, sizeof(int));
*tds__GetCapabilitiesResponse-&Capabilities-&Media-&StreamingCapabilities-&RTP_USCORETCP = _
tds__GetCapabilitiesResponse-&Capabilities-&Media-&StreamingCapabilities-&RTP_USCORERTSP_USCORETCP = (int *)soap_malloc(soap, sizeof(int));
*tds__GetCapabilitiesResponse-&Capabilities-&Media-&StreamingCapabilities-&RTP_USCORERTSP_USCORETCP = _
tds__GetCapabilitiesResponse-&Capabilities-&Media-&StreamingCapabilities-&Extension = NULL;
tds__GetCapabilitiesResponse-&Capabilities-&Media-&Extension = NULL;
tds__GetCapabilitiesResponse-&Capabilities-&Media-&__size = 0;
tds__GetCapabilitiesResponse-&Capabilities-&Media-&__any = 0;另外必要填充的还有
//下面的重要,这里只实现视频流,需要设置VideoSources
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&DeviceIO-&VideoSources = TRUE;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&DeviceIO-&VideoOutputs = FALSE;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&DeviceIO-&AudioSources = FALSE;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&DeviceIO-&AudioOutputs = FALSE;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&DeviceIO-&RelayOutputs = FALSE;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&DeviceIO-&__size = 0;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&DeviceIO-&__any = NULL;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&Display = NULL;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&Recording = NULL;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&Search = NULL;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&Replay = NULL;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&Receiver = NULL;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&AnalyticsDevice = NULL;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&Extensions = NULL;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&__size = 0;
tds__GetCapabilitiesResponse-&Capabilities-&Extension-&__any = NULL;
2、实现GetServices命令
__tds__GetServices(struct soap* soap, struct _tds__GetServices *tds__GetServices, struct _tds__GetServicesResponse *tds__GetServicesResponse)
DBG(&__tds__GetServices\n&);
/*该函数很必要*/
char _IPAddr[INFO_LENGTH];
int i = 0;
sprintf(_IPAddr, &http://%03d.%03d.%03d.%03d/onvif/services&, 192, 168, 1, 233);
tds__GetServicesResponse-&__sizeService = 1;
tds__GetServicesResponse-&Service = (struct tds__Service *)soap_malloc(soap, sizeof(struct tds__Service));
tds__GetServicesResponse-&Service[0].XAddr = (char *)soap_malloc(soap, sizeof(char) * INFO_LENGTH);
tds__GetServicesResponse-&Service[0].Namespace = (char *)soap_malloc(soap, sizeof(char) * INFO_LENGTH);
strcpy(tds__GetServicesResponse-&Service[0].Namespace, &http://www.onvif.org/ver10/events/wsdl&);
strcpy(tds__GetServicesResponse[0].Service-&XAddr, _IPAddr);
tds__GetServicesResponse-&Service[0].Capabilities = NULL;
tds__GetServicesResponse-&Service[0].Version = (struct tt__OnvifVersion *)soap_malloc(soap, sizeof(struct tt__OnvifVersion));
tds__GetServicesResponse-&Service[0].Version-&Major = 0;
tds__GetServicesResponse-&Service[0].Version-&Minor = 3;
tds__GetServicesResponse-&Service[0].__any = (char **)soap_malloc(soap, sizeof(char *));
tds__GetServicesResponse-&Service[0].__any[0] = (char *)soap_malloc(soap, sizeof(char) * INFO_LENGTH);
strcpy(tds__GetServicesResponse-&Service[0].__any[0],&why1&);
tds__GetServicesResponse-&Service[0].__any[1] = (char *)soap_malloc(soap,sizeof(char) * INFO_LENGTH);
strcpy(tds__GetServicesResponse-&Service[0].__any[1],&why2&);
tds__GetServicesResponse-&Service[0].__size = NULL;
tds__GetServicesResponse-&Service[0].__anyAttribute = NULL;
return SOAP_OK;
3、实现GetVideoSources命令
__tmd__GetVideoSources(struct soap* soap, struct _trt__GetVideoSources *trt__GetVideoSources, struct _trt__GetVideoSourcesResponse *trt__GetVideoSourcesResponse)
DBG(&__tmd__GetVideoSources\n&);
int size1;
size1 = 1;
trt__GetVideoSourcesResponse-&__sizeVideoSources = size1;
trt__GetVideoSourcesResponse-&VideoSources = (struct tt__VideoSource *)soap_malloc(soap, sizeof(struct tt__VideoSource) * size1);
trt__GetVideoSourcesResponse-&VideoSources[0].Framerate = 30;
trt__GetVideoSourcesResponse-&VideoSources[0].Resolution = (struct tt__VideoResolution *)soap_malloc(soap, sizeof(struct tt__VideoResolution));
trt__GetVideoSourcesResponse-&VideoSources[0].Resolution-&Height = 720;
trt__GetVideoSourcesResponse-&VideoSources[0].Resolution-&Width = 1280;
trt__GetVideoSourcesResponse-&VideoSources[0].token = (char *)soap_malloc(soap, sizeof(char)*INFO_LENGTH);
strcpy(trt__GetVideoSourcesResponse-&VideoSources[0].token,&GhostyuSource_token&); //注意这里需要和GetProfile中的sourcetoken相同
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging =(struct tt__ImagingSettings*)soap_malloc(soap, sizeof(struct tt__ImagingSettings));
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&Brightness = (float*)soap_malloc(soap,sizeof(float));
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&Brightness[0] = 128;
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&ColorSaturation = (float*)soap_malloc(soap,sizeof(float));
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&ColorSaturation[0] = 128;
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&Contrast = (float*)soap_malloc(soap,sizeof(float));
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&Contrast[0] = 128;
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&IrCutFilter = (int *)soap_malloc(soap,sizeof(int));
*trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&IrCutFilter = 0;
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&Sharpness = (float*)soap_malloc(soap,sizeof(float));
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&Sharpness[0] = 128;
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&BacklightCompensation = (struct tt__BacklightCompensation*)soap_malloc(soap, sizeof(struct tt__BacklightCompensation));
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&BacklightCompensation-&Mode = 0;
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&BacklightCompensation-&Level = 20;
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&Exposure = NULL;
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&Focus = NULL;
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&WideDynamicRange = (struct tt__WideDynamicRange*)soap_malloc(soap, sizeof(struct tt__WideDynamicRange));
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&WideDynamicRange-&Mode = 0;
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&WideDynamicRange-&Level = 20;
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&WhiteBalance = (struct tt__WhiteBalance*)soap_malloc(soap, sizeof(struct tt__WhiteBalance));
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&WhiteBalance-&Mode = 0;
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&WhiteBalance-&CrGain = 0;
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&WhiteBalance-&CbGain = 0;
trt__GetVideoSourcesResponse-&VideoSources[0].Imaging-&Extension = NULL;
trt__GetVideoSourcesResponse-&VideoSources[0].Extension = NULL;
return SOAP_OK;
}__tmd__GetVideoSources最重要的是token的填充,必须要和下面profile中的sourcetoken相同,需要匹配到这个视频源
4、实现GetProfiles命令
trt__GetProfilesResponse-&Profiles =(struct tt__Profile *)soap_malloc(soap, sizeof(struct tt__Profile) * size);
trt__GetProfilesResponse-&__sizeProfiles =
trt__GetProfilesResponse-&Profiles[i].Name = (char *)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);
strcpy(trt__GetProfilesResponse-&Profiles[i].Name,&my_profile&);
trt__GetProfilesResponse-&Profiles[i].token= (char *)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);
strcpy(trt__GetProfilesResponse-&Profiles[i].token,&token_profile&);
trt__GetProfilesResponse-&Profiles[i].fixed = _
trt__GetProfilesResponse-&Profiles[i].__anyAttribute = NULL;除了上面的基本信息,还需要填充两大项:VideoSourceConfiguration和VideoEncoderConfiguration,一个用于描述视频源的信息,另外一个描述视频的编码信息
先给VideoSourceConfiguration分配空间
trt__GetProfilesResponse-&Profiles[i].VideoSourceConfiguration = (struct tt__VideoSourceConfiguration *)soap_malloc(soap,sizeof(struct tt__VideoSourceConfiguration ));
trt__GetProfilesResponse-&Profiles[i].VideoSourceConfiguration-&Name = (char *)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);
trt__GetProfilesResponse-&Profiles[i].VideoSourceConfiguration-&token = (char *)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);
trt__GetProfilesResponse-&Profiles[i].VideoSourceConfiguration-&SourceToken = (char *)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);
trt__GetProfilesResponse-&Profiles[i].VideoSourceConfiguration-&Bounds = (struct tt__IntRectangle *)soap_malloc(soap,sizeof(struct tt__IntRectangle));
然后在填充它
/*注意SourceToken*/
strcpy(trt__GetProfilesResponse-&Profiles[i].VideoSourceConfiguration-&Name,&VS_Name&);
strcpy(trt__GetProfilesResponse-&Profiles[i].VideoSourceConfiguration-&token,&VS_Token&);
strcpy(trt__GetProfilesResponse-&Profiles[i].VideoSourceConfiguration-&SourceToken,&GhostyuSource_token&); /*必须与__tmd__GetVideoSources中的token相同*/
trt__GetProfilesResponse-&Profiles[i].VideoSourceConfiguration-&UseCount = 1;
trt__GetProfilesResponse-&Profiles[i].VideoSourceConfiguration-&Bounds-&x = 1;
trt__GetProfilesResponse-&Profiles[i].VideoSourceConfiguration-&Bounds-&y = 1;
trt__GetProfilesResponse-&Profiles[i].VideoSourceConfiguration-&Bounds-&height = 720;
trt__GetProfilesResponse-&Profiles[i].VideoSourceConfiguration-&Bounds-&width = 1280;如果是指针必须先用soap_malloc分配内存,然后才能赋值
下面是VideoEncoderConfiguration
trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration = (struct tt__VideoEncoderConfiguration *)soap_malloc(soap,sizeof(struct tt__VideoEncoderConfiguration));
trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration-&Name = (char *)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);
trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration-&token= (char *)soap_malloc(soap,sizeof(char)*MAX_PROF_TOKEN);
strcpy(trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration-&Name,&VE_Name1&);
strcpy(trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration-&token,&VE_token1&);
trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration-&UseCount = 1;
trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration-&Quality = 10;
trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration-&Encoding = 1;//JPEG = 0, MPEG4 = 1, H264 = 2;
trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration-&Resolution = (struct tt__VideoResolution *)soap_malloc(soap, sizeof(struct tt__VideoResolution));
trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration-&Resolution-&Height = 720;
trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration-&Resolution-&Width = 1280;
trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration-&RateControl = (struct tt__VideoRateControl *)soap_malloc(soap, sizeof(struct tt__VideoRateControl));
trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration-&RateControl-&FrameRateLimit = 30;
trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration-&RateControl-&EncodingInterval = 1;
trt__GetProfilesResponse-&Profiles[i].VideoEncoderConfiguration-&RateControl-&BitrateLimit = 500;
5、GetVideoSourceConfiguration和GetVideoEncoderConfiguration
__trt__GetVideoSourceConfiguration(struct soap* soap, struct _trt__GetVideoSourceConfiguration *trt__GetVideoSourceConfiguration, struct _trt__GetVideoSourceConfigurationResponse *trt__GetVideoSourceConfigurationResponse)
DBG(&__trt__GetVideoSourceConfiguration\n&);
//该函数必要,live video需要
return SOAP_OK;
__trt__GetVideoEncoderConfiguration(struct soap* soap, struct _trt__GetVideoEncoderConfiguration *trt__GetVideoEncoderConfiguration, struct _trt__GetVideoEncoderConfigurationResponse *trt__GetVideoEncoderConfigurationResponse)
DBG(&__trt__GetVideoEncoderConfiguration\n&);
return SOAP_OK;
6、GetVideoEncoderConfigurationOptions
__trt__GetVideoEncoderConfigurationOptions(struct soap* soap, struct _trt__GetVideoEncoderConfigurationOptions *trt__GetVideoEncoderConfigurationOptions, struct _trt__GetVideoEncoderConfigurationOptionsResponse *trt__GetVideoEncoderConfigurationOptionsResponse)
DBG(&__trt__GetVideoEncoderConfigurationOptions\n&);
//该函数必要,video streaming需要
return SOAP_OK;
}以上5、6不分的代码直接返回SOAP_OK即可,正常来说是应该填充的,这里不影响RTSP Video Stream,暂时就不去动它
四、运行live555MediaServer服务器
live555官网有很多测试文件,我这里用的是MPEG4的测试文件路劲为rtsp://192.168.1.201/petrov.m4e
五、启动Onvif Device Manager测试
有一个问题,OnvifDeviceManager的并不能自动发现设备(OnvifTestTool可以),还好它提供了手动添加功能
单击add,添加如下内容:http://192.168.1.233/onvif/device_service
注意,我在程序中固定了两个IP:linux192.168.1.233,windows:192.168.1.201,这里需看情况修改
测试截图:
1、Live video
2、Video streaming
3、Profiles
最后是运行的live555 rtsp服务器
终端打印的DEBUG信息
源代码下载地址:http://download.csdn.net/detail/ghostyu/4796093
【来自http://blog.csdn.net/ghostyu,】
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:458820次
积分:5590
积分:5590
排名:第1536名
原创:89篇
转载:23篇
评论:544条
(1)(1)(3)(1)(2)(1)(1)(6)(8)(4)(11)(12)(2)(4)(1)(5)(5)(1)(10)(10)(9)(14)当前时间:
ONVIF协议知识
摘要:ONVIF,全称Open Network Video Interface Forum,即开放性网络视频接口论坛,由Axis、Bosch和Sony三家企业联合推出,是全球影响力最大的网络视频监控行业标准组织,其目的是以公开、开放的原则共同制定开放性网络视频监控行业标准。
& & & ONVIF,全称Open Network Video Interface Forum,即开放性网络视频接口论坛,由Axis、Bosch和Sony三家企业联合推出,是全球影响力最大的网络视频监控行业标准组织,其目的是以公开、开放的原则共同制定开放性网络视频监控行业标准。2008年11月,该组织正式发布了ONVIF第一版规范——ONVIF核心规范1.0。这一标准将为网络视频设备之间的信息交换定义通用协议(诸如装置搜寻、实时视频、音频、元数据和控制信息)。
  标准化对于推动网络视频监控的发展意义重大。因为过去的模拟和DVR数字监控产品正是由于没有统一的行业标准,而使得厂家各自为政,每个厂家都采用自己的标准,致使步入网络化时代后,用户面临监控系统联网等诸多核心需求时障碍重重。& & 随着IP视频监控市场的迅速增长,产业链上下游的一大批企业都纷纷加快推出IP视频监控相关产品。业界人士认为,未来的几年内,IP视频监控系统建设成本将迅速降低,市场份额也将随之获得很大提升,面对日趋庞大的市场,整个视频监控产业链的分工将越来越细,例如有些厂商专门做前端,有些厂商专门做平台,之后再通过集成商进行集成,提供给最终客户。日趋成熟的视频监控市场即将成形的这种紧密产业合作模式,使得亟需各厂商产品提供标准化接口,以满足整个监控产业的良性发展。
深圳市未来域科技有限公司 Copyright(C)2011&&ONVIF 协议设备接入兼容ONVIF协议的客户端或NVR时,连接端口怎么填?-希泰官网(中国)
ONVIF 协议设备接入兼容ONVIF协议的客户端或NVR时,连接端口怎么填?
ONVIF 协议设备接入兼容ONVIF协议的客户端或NVR时,连接端口怎么填?设备版本为ONVIF固件版本时,可以手动添加设备也可以通过搜索IP来添加设备,手动添加设备时连接端口为设备的Web访问端口,通过搜索IP来添加时不用输入连接端口,用NVR默认的即可。
Copyright & 2004- . All Rights Reserved 希泰电子版权所有
&&粤ICP备号&&兼容onvif协议的电脑客户端 - 下载频道 - CSDN.NET
&&&&兼容onvif协议的电脑客户端
&兼容onvif协议的电脑客户端
兼容onvif协议的电脑客户端,终极神器
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 传优质资源可以获取积分,详细见。选择完成有奖的任务,可以获取积分。选择购买VIP会员服务,无需积分下载资源。评价资源返积分:第一次绑定手机,将获50下载积分及100论坛可用分。论坛可用分兑换下载积分。
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
服务器应用下载排行
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
兼容onvif协议的电脑客户端
所需积分:3
剩余积分:
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000

我要回帖

更多关于 onvif协议是什么 的文章

 

随机推荐