基于 gsoap 生成 onvif 服务端的基础上对接客户端私有接口
前言
基于 gsoap 生成 onvif 服务端框架代码,基本只能处理原来的 wsdl 上原有定义的接口!在实际项目里运用,很大可能还需要对接客户定制的私有接口,这个时候就需要改服务端的代码,接下来就是对修改源码做一下记录!!!
1、处理客户端的私有接口
通过调试发现,入口函数在于 soap_serve(), 客户端请求的接口在里面判断后不符合onvif标准接口就做了 close 操作!
soap_serve 的源码
SOAP_FMAC5 int SOAP_FMAC6 soap_serve(struct soap *soap)
{
#ifndef WITH_FASTCGI
soap->keep_alive = soap->max_keep_alive + 1;
#endif
do
{
#ifndef WITH_FASTCGI
if (soap->keep_alive > 0 && soap->max_keep_alive > 0)
soap->keep_alive--;
#endif
int value = soap_begin_serve(soap);
//printf("soap_begin_serve = %d soap->error = %d \n", value, soap->error);
if (value)
{ if (soap->error >= SOAP_STOP)
continue;
return soap->error;
}
if ((soap_serve_request(soap) || (soap->fserveloop && soap->fserveloop(soap))) && soap->error && soap->error < SOAP_STOP)
{
#ifdef WITH_FASTCGI
soap_send_fault(soap);
#else
return soap_send_fault(soap);
#endif
}
#ifdef WITH_FASTCGI
soap_destroy(soap);
soap_end(soap);
} while (1);
#else
} while (soap->keep_alive);
#endif
return SOAP_OK;
}
在 soap_begin_serve()接口里面判断,如果满足条件 soap->error < SOAP_STOP ,里面就会 soap_closesock(soap); 就会引起后面的回复异常的问题!
所以需要在里面做处理,如果判断到是 SOAP_POST 方法,而且是私有接口的,就让它按正常流程走!下面是具体修改的点(stdsoap2.c 文件里面的接口)
接下来修改:soapServer.c 文件的接口
soap_serve_request 接口里面上添加对应的触发接口
如下图:
同时需要实现相对应的方法:
soapStub.h 添加接口的定义
SOAP_FMAC5 int SOAP_FMAC6 __soap_serve_turnOnAudioAlert(struct soap*, char *);
SOAP_FMAC5 int SOAP_FMAC6 __soap_serve_turnOnPanicSwitch(struct soap*, char *);
SOAP_FMAC5 int SOAP_FMAC6 soap_serve_turnOnAudioAlert(struct soap *soap);
SOAP_FMAC5 int SOAP_FMAC6 soap_serve_turnOnPanicSwitch(struct soap *soap);
onvif_server_interface.c 外部的实现:
以上就是 onvif 服务器上添加私有接口的特殊处理了!!!
如果伙伴们有更好的方法,欢迎指导一下!!!
前期文章:
1、onvif 服务端的代码生成
2、实现相关接口实现出图功能