ONVIF协议实现1:Server端Discovery的实现详解
来源:互联网 发布:淘宝真人买家秀福利 编辑:程序博客网 时间:2024/05/16 00:32
最近在做摄像机ONVIF的协议,看了几天文档调了点代码和大家分享下,下步准备实现RTSP的流地址的获取。
附件里面是我的完整代码工程,使用的是arm-linux-gcc,代码也可以在X86的Linux上跑,只要将Makefile里面额CC=arm-linux-gcc换成gcc即可
工作平台及工具:
Ubuntu:12.04 + arm-linux-gcc/gcc + OnvifTestTool12.12
gsoap下载:http://www.cs.fsu.edu/~engelen/soap.html
目前的最新版本为:gsoap2.8.21
1.搞定工具:
首先需要做的是提取工具一共有3样:
soapcpp2 wsdl2h typemap.dat
我下载的的gsoap里面的typemap.dat已经包含了WS-Discovery的支持因此不需要再像网上那样去添加ONVIF支持了
下载好的源码解压出来,到gsoap-2.8/gsoap/bin目录里面一看,没有我们需要的soapcpp2 wsdl2h:
没有我们只好自己编译一个了,看了下他的README.txt里面有这么一句话(PS:我比较喜欢看项目里面的README能帮助我们解决很多问题).
For other platforms: see installation instructions INSTALL.txt in the root dir.
到根目录里面看下INSTALL.txt知道了怎么编译了
cd gsoap/src
make -f MakefileManual
cd gsoap/wsdl
make -f MakefileManual
2. Remotediscovery.wsdl产生onvif.h头文件
对于这里我们只要实现设备发现的功能,所以我们只需要Remotediscovery.wsdl这一个wsdl就可以了
./wsdl2h -o onvif.h -c -s -k -t ./typemap.dat http://www.onvif.org/onvif/ver10 ... emotediscovery.wsdl
生成的时候会报SOAP_ENV__Fault
重定义的错误,将gsoap-2.8/gsoap/import/wsa5.h里面的第277行的SOAP_ENV__Fault改为SOAP_ENV__Fault_ex就可以了
3.生成ONVIF的框架代码
./soapcpp2 -c onvif.h -x -d ./ -I ${HOME}/workspace/source/gsoap-2.8/gsoap/import -I ${HOME}/workspace/source/gsoap-2.8/gsoap/
这里的${HOME}/workspace/source/gsoap-2.8/gsoap/import 和${HOME}/workspace/source/gsoap-2.8/gsoap/注意修成自己的。
这里会报
4.拷贝相关代码
建立一个onvif_test的目录将${HOME}/workspace/source/gsoap-2.8如下文件拷贝过来过来
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
这些代码会帮我很多工作的,下面就知道了
5.实现关键代码
这个就是回应设备发现工具的主要代码,是不是很简单如果不适用wsddapi.c 里面的代码将要写一大推的填充代码具体,具体可以看最后面的参考链接。
6.实现的main函数
整体的主函数就是这样,需要注意的一点是需要在wsdd.nsmap里多添加一个命名空间
{"tds", "http://www.onvif.org/ver10/device/wsdl", NULL, NULL},
7.测试结果
消息格式:
8.过程总结
ONVIF这个设备发现的实现耗费了我好几天近去调试和阅读相关文档,虽然网上有很多的资料可供参考,但是真正去理解所有的东西还是要花上一些功夫的
如xml的命名空间,gsoap的消息格式和wsdl等,这些东西还是很耗费时间的,尤其是调试出问题后怎么去解决问题。
PC端抓包收到了,但是还是发现不了设备?
可能出现的问题1:
"tdn:NetworkVideoTransmitter"填的不对他的前缀不是随便填的是和命名空间相关的
可能出现的问题2:
wsa:RelatesTo这个字段没有,这个没有的原因是因为我们使用到了 int soap_wsa_reply(struct soap *soap, const char *id, const char *action) 函数
而这个函数里面里面有这些代码
struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id);
struct SOAP_ENV__Header *oldheader, *newheader;
DBGFUN1("soap_wsa_reply", "action=%s", action?action:"(null)");
if (!data) // 这里总是返回0
return soap->error = SOAP_PLUGIN_ERROR;
网上收到了一些做法是将
if (!data) return soap->error = SOAP_PLUGIN_ERROR;
向后移一移解决的,填充了wsa:RelatesTo再判断,我觉得问题不是这么来的,最终我调试和血毒代码后,加上了 soap_register_plugin(&soap, soap_wsa);
完美解决,同时知道了为什么这么做,这很重要。见gsoap-2.8/gsoap/doc/wsa里面的文档
参考链接:
http://blog.csdn.net/ghostyu/article/details/8182516
附件里面是我的完整代码工程,使用的是arm-linux-gcc,代码也可以在X86的Linux上跑,只要将Makefile里面额CC=arm-linux-gcc换成gcc即可
工作平台及工具:
Ubuntu:12.04 + arm-linux-gcc/gcc + OnvifTestTool12.12
gsoap下载:http://www.cs.fsu.edu/~engelen/soap.html
目前的最新版本为:gsoap2.8.21
1.搞定工具:
首先需要做的是提取工具一共有3样:
soapcpp2 wsdl2h typemap.dat
我下载的的gsoap里面的typemap.dat已经包含了WS-Discovery的支持因此不需要再像网上那样去添加ONVIF支持了
下载好的源码解压出来,到gsoap-2.8/gsoap/bin目录里面一看,没有我们需要的soapcpp2 wsdl2h:
没有我们只好自己编译一个了,看了下他的README.txt里面有这么一句话(PS:我比较喜欢看项目里面的README能帮助我们解决很多问题).
For other platforms: see installation instructions INSTALL.txt in the root dir.
到根目录里面看下INSTALL.txt知道了怎么编译了
cd gsoap/src
make -f MakefileManual
cd gsoap/wsdl
make -f MakefileManual
2. Remotediscovery.wsdl产生onvif.h头文件
对于这里我们只要实现设备发现的功能,所以我们只需要Remotediscovery.wsdl这一个wsdl就可以了
./wsdl2h -o onvif.h -c -s -k -t ./typemap.dat http://www.onvif.org/onvif/ver10 ... emotediscovery.wsdl
生成的时候会报SOAP_ENV__Fault
重定义的错误,将gsoap-2.8/gsoap/import/wsa5.h里面的第277行的SOAP_ENV__Fault改为SOAP_ENV__Fault_ex就可以了
3.生成ONVIF的框架代码
./soapcpp2 -c onvif.h -x -d ./ -I ${HOME}/workspace/source/gsoap-2.8/gsoap/import -I ${HOME}/workspace/source/gsoap-2.8/gsoap/
这里的${HOME}/workspace/source/gsoap-2.8/gsoap/import 和${HOME}/workspace/source/gsoap-2.8/gsoap/注意修成自己的。
这里会报
4.拷贝相关代码
建立一个onvif_test的目录将${HOME}/workspace/source/gsoap-2.8如下文件拷贝过来过来
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
这些代码会帮我很多工作的,下面就知道了
5.实现关键代码
这个就是回应设备发现工具的主要代码,是不是很简单如果不适用wsddapi.c 里面的代码将要写一大推的填充代码具体,具体可以看最后面的参考链接。
6.实现的main函数
整体的主函数就是这样,需要注意的一点是需要在wsdd.nsmap里多添加一个命名空间
{"tds", "http://www.onvif.org/ver10/device/wsdl", NULL, NULL},
7.测试结果
消息格式:
8.过程总结
ONVIF这个设备发现的实现耗费了我好几天近去调试和阅读相关文档,虽然网上有很多的资料可供参考,但是真正去理解所有的东西还是要花上一些功夫的
如xml的命名空间,gsoap的消息格式和wsdl等,这些东西还是很耗费时间的,尤其是调试出问题后怎么去解决问题。
PC端抓包收到了,但是还是发现不了设备?
可能出现的问题1:
"tdn:NetworkVideoTransmitter"填的不对他的前缀不是随便填的是和命名空间相关的
可能出现的问题2:
wsa:RelatesTo这个字段没有,这个没有的原因是因为我们使用到了 int soap_wsa_reply(struct soap *soap, const char *id, const char *action) 函数
而这个函数里面里面有这些代码
struct soap_wsa_data *data = (struct soap_wsa_data*)soap_lookup_plugin(soap, soap_wsa_id);
struct SOAP_ENV__Header *oldheader, *newheader;
DBGFUN1("soap_wsa_reply", "action=%s", action?action:"(null)");
if (!data) // 这里总是返回0
return soap->error = SOAP_PLUGIN_ERROR;
网上收到了一些做法是将
if (!data) return soap->error = SOAP_PLUGIN_ERROR;
向后移一移解决的,填充了wsa:RelatesTo再判断,我觉得问题不是这么来的,最终我调试和血毒代码后,加上了 soap_register_plugin(&soap, soap_wsa);
完美解决,同时知道了为什么这么做,这很重要。见gsoap-2.8/gsoap/doc/wsa里面的文档
参考链接:
http://blog.csdn.net/ghostyu/article/details/8182516
http://www.360doc.com/content/14/0828/15/9075092_405360193.shtml
【from:http://www.ebaina.com/bbs/thread-4929-1-1.html】
1 0
- ONVIF协议实现1:Server端Discovery的实现详解
- onvif server端Discovery实现,通过OnvifTestTool12.06测试【转】
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试 .
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- onvif规范的实现:server端Discovery实现,通过OnvifTestTool12.06测试
- ONVIF学习之实现discovery
- ONVIF 客户端简单实现Discovery,实现设备搜索.
- 解决Android Studio启动失败
- 新服配置 ftp 下载文件
- Druid是什么以及用StatViewServlet用于展示Druid的统计信息
- controllers.js以及scope介绍
- 仿余额宝跳转精度问题
- ONVIF协议实现1:Server端Discovery的实现详解
- Qt入门-layout布局
- spring HttpMessageConverter
- echarts 初始(一)
- iOS开发经验积累 二
- 数值积分
- 原型设计创新[商品详情页面]
- Beginning Python Chapter5
- JRTPLIB 信息收集