GSOAP编译,并生成ONVIF框架

2023-10-20 17:28
文章标签 编译 生成 框架 onvif gsoap

本文主要是介绍GSOAP编译,并生成ONVIF框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近又重新生成了一遍onvif的框架,相对于以前有了一些改变,例如onvif文档变成了https。
接下来将详细的生成过程进行描述:

本次生成过程是基于Redhat8.2的系统环境

  1. 下载GSOAP开源版
    下载gsoap

  2. GSOAP官方文档
    官方网页

  3. 编译前需要先编译安装bison、flex、openssl
    a. 下载flex2.6.4
    b. 下载bison3.8
    c. 下载openssl1.1.q openssl 可以用已经装好的版本

  4. 编译前还需安装部分东西

    yum install libtool
    yum install gettext gettext-devel gettext-common-devel
    yum -y install gcc automake autoconf libtool make
    yum -y install m4
    yum -y install bison flex
    
  5. 编译bison

    xz -d bison-3.8.tar.xz
    tar -xvf bison-3.8.tar
    cd bison-3.8/
    ./configure
    make -j 6
    make install
    
  6. 编译flex

    wget https://github.com/westes/flex/files/981163/flex-2.6.4.tar.gz
    tar -zxvf flex-2.6.4.tar.gz
    cd flex-2.6.4/
    mkdir build
    cd build
    ../configure
    make -j 6
    make install
    
  7. 编译gsoap

    wget https://udomain.dl.sourceforge.net/project/gsoap2/gsoap_2.8.122.zip
    unzip gsoap_2.8.122.zip
    cd gsoap-2.8/
    ./configure --help
    ./configure
    make -j 6
    make install
    ln -sf /usr/local/bin/wsdl2h /usr/bin/wsdl2h
    ln -sf /usr/local/bin/soapcpp2 /usr/bin/soapcpp2
    cd gsoap
    mkdir onvif
    vim typemap.dat
    #去掉xsd__duration = #import "custom/duration.h" | xsd__duration 前面的注释
    #修改命名空间如下
    tds     = "http://www.onvif.org/ver10/device/wsdl"
    tev     = "http://www.onvif.org/ver10/events/wsdl"
    tls     = "http://www.onvif.org/ver10/display/wsdl"
    tmd     = "http://www.onvif.org/ver10/deviceIO/wsdl"
    timg    = "http://www.onvif.org/ver20/imaging/wsdl"
    trt     = "http://www.onvif.org/ver10/media/wsdl"
    tr2     = "http://www.onvif.org/ver20/media/wsdl"
    tptz    = "http://www.onvif.org/ver20/ptz/wsdl"
    trv     = "http://www.onvif.org/ver10/receiver/wsdl"
    trc     = "http://www.onvif.org/ver10/recording/wsdl"
    tse     = "http://www.onvif.org/ver10/search/wsdl"
    trp     = "http://www.onvif.org/ver10/replay/wsdl"
    tan     = "http://www.onvif.org/ver20/analytics/wsdl"
    tad     = "http://www.onvif.org/ver10/analyticsdevice/wsdl"
    tas     = "http://www.onvif.org/ver10/advancedsecurity/wsdl"
    tdn     = "http://www.onvif.org/ver10/network/wsdl"
    tt      = "http://www.onvif.org/ver10/schema"tac     = "http://www.onvif.org/ver10/accesscontrol/wsdl"
    tar     = "http://www.onvif.org/ver10/accessrules/wsdl"
    tae     = "http://www.onvif.org/ver10/actionengine/wsdl"
    tas     = "http://www.onvif.org/ver10/advancedsecurity/wsdl"
    tab     = "http://www.onvif.org/ver10/authenticationbehavior/wsdl"
    tcr     = "http://www.onvif.org/ver10/credential/wsdl"
    tdc     = "http://www.onvif.org/ver10/doorcontrol/wsdl"
    tpv     = "http://www.onvif.org/ver10/provisioning/wsdl"
    tsc     = "http://www.onvif.org/ver10/schedule/wsdl"
    tth     = "http://www.onvif.org/ver10/thermal/wsdl"
    tup     = "http://www.onvif.org/ver10/uplink/wsdl"
    pt      = "http://www.onvif.org/ver10/pacs"
    thf     = "http://www.onvif.org/ver20/analytics/humanface"
    thb     = "http://www.onvif.org/ver20/analytics/humanbody"
    tns     = "http://www.onvif.org/onvif/ver10/network/wsdl"#输入指令
    wsdl2h -t ./typemap.dat -o onvif/onvif.h https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl https://www.onvif.org/ver10/events/wsdl/event.wsdl https://www.onvif.org/ver10/pacs/accesscontrol.wsdl https://www.onvif.org/ver10/actionengine.wsdl https://www.onvif.org/ver20/analytics/wsdl/analytics.wsdl https://www.onvif.org/ver10/authenticationbehavior/wsdl/authenticationbehavior.wsdl https://www.onvif.org/ver10/credential/wsdl/credential.wsdl https://www.onvif.org/ver10/deviceio.wsdl https://www.onvif.org/ver10/display.wsdl https://www.onvif.org/ver10/pacs/doorcontrol.wsdl https://www.onvif.org/ver20/imaging/wsdl/imaging.wsdl https://www.onvif.org/ver10/media/wsdl/media.wsdl https://www.onvif.org/ver20/media/wsdl/media.wsdl https://www.onvif.org/ver10/provisioning/wsdl/provisioning.wsdl https://www.onvif.org/ver20/ptz/wsdl/ptz.wsdl https://www.onvif.org/ver10/receiver.wsdl https://www.onvif.org/ver10/recording.wsdl https://www.onvif.org/ver10/search.wsdl https://www.onvif.org/ver10/replay.wsdl https://www.onvif.org/ver10/schedule/wsdl/schedule.wsdl https://www.onvif.org/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl https://www.onvif.org/ver10/thermal/wsdl/thermal.wsdl  https://www.onvif.org/ver10/uplink/wsdl/uplink.wsdl http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl http://docs.oasis-open.org/wsn/bw-2.wsdlvim onvif/onvif.h
    # 添加 #import "wsse.h"
    soapcpp2 -2 -x -L -I import:custom -d onvif/ onvif/onvif.h
    cp stdsoap2.c stdsoap2.h dom.c plugin/wsaapi.c plugin/wsaapi.h custom/duration.c custom/duration.h plugin/threads.c plugin\threads.h plugin\smdevp.c plugin\smdevp.h plugin\mecevp.c plugin\mecevp.h plugin\wsseapi.h plugin\wsseapi.c plugin\wsddapi.h plugin\wsddapi.c onvif/
    # 将duration.c 修改为duration.cpp(duration.c 可能编译不过)
    # 完成编译
    
  8. 编写实例

    #编译实例
    #编译过程中有些警告或者类型转换错误,直接正常修改即可。
    #若出现无法链接的符合,加上-DWITH_OPENSSL试试
    #编译客户端或服务端的时候注意soapClient.cpp和soapServer.cpp只有一个
    #无法解析的外部符号namespaces,添加头文件#include “onvif.nsmap”
    #里面有多个nsmap,随便找一个重命名为onvif.nsmap
    #最后需要再 onvif\stdsoap2.c文件,在开头加入:#include “onvif.nsmap”

使用举例:

int main()
{    struct soap* soap = soap_new();soap->send_timeout = 5;soap->recv_timeout = 5;soap->connect_timeout = 5;do {soap->user = (char*)_strUserName.c_str();soap->passwd = (char*)_strPassword.c_str();_tds__GetDeviceInformation req;_tds__GetDeviceInformationResponse rsp;soap_wsse_add_UsernameTokenDigest(soap, NULL, _strUserName.c_str(), _strPassword.c_str());auto ret = soap_call___tds__GetDeviceInformation(soap,strDevAddr.c_str(), NULL, &req, rsp);if (ret != SOAP_OK){LOG_ERROR(*context_onvif->pLogger, "<%s>: soap_call___tds__GetDeviceInformation failed. soap code: %?d, ip: %s id: %s",string(__FUNCTION__), ret, _strDeviceIp, _strDeviceId);break;}LOG_INFO(*context_onvif->pLogger, "<%s>: device Info: %s-%s-%s-%s-%s. ip: %s id: %s",string(__FUNCTION__), rsp.FirmwareVersion, rsp.HardwareId, rsp.HardwareId, rsp.Manufacturer, rsp.Model, _strDeviceIp, _strDeviceId);} while (false);soap_destroy(soap); // delete managed objectssoap_end(soap);     // delete managed data and temporaries soap_free(soap);    // finalize and delete the context
}

这篇关于GSOAP编译,并生成ONVIF框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/248569

相关文章

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1