上周弄了一周都没有弄出来,今天又去研究了下ONVIF Device Test Tool。终于有所发现了。

首先肯定是soap,关于鉴权的soap就不展开说了。

然后是获取能力。这里我是获取了所有能力。

接着是GetProfiles,为了得到在控制PTZ时的token。

代码已经调试通了某华和某康的IPC。

一开始我们用的是某华,在GetProfiles是的地址是PTZ的。但是在兼容某康时,变成了为实现可选项。通过上面说到的工具发现。用的token是Media的。但是控制的时候的地址是PTZ的。

下面上代码。实现的是相对位移的接口。

int onvif_OptPTZ(char* strIp, int port, char* user, char* password, ptz_common commond, float move_step)
{
    int result = 0;
    struct SOAP_ENV__Header Header;
    struct soap *soap = NULL;
    char *strOptPtz = NULL;
    char *strGetToken = NULL;

//鉴权信息
    USERINFO stUserInfo;
    USERINFO *pAuth = NULL;

memset(&stUserInfo, 0x0, sizeof(stUserInfo));
    if(user == NULL || password == NULL)
    {
        pAuth = NULL;
    }
    else
    {
        snprintf(stUserInfo.username, 64, "%s", user);
        snprintf(stUserInfo.password, 32, "%s", password);
        pAuth = &stUserInfo;
    }

//创建一个带鉴权的soap
    soap = ONVIF_Initsoap(&Header, NULL, NULL, 5, pAuth);
    if(NULL == soap)
    {
        printf("FUNCTION:(%s) ---- Init soap error!\n", __FUNCTION__);
        return -1;
    }

char soap_endpoint[128];
    snprintf(soap_endpoint, 128, "http://%s:%d/onvif/device_service", strIp, port);

_tds__GetCapabilities abi_req;
    _tds__GetCapabilitiesResponse abi_resp;

memset(&abi_req, 0x0, sizeof(abi_req));
    memset(&abi_resp, 0x0, sizeof(abi_resp));

abi_req.__sizeCategory = 1;
    abi_req.Category = (enum tt__CapabilityCategory *)soap_malloc(soap, sizeof(int));
    *(abi_req.Category) = tt__CapabilityCategory__All;

soap->header = &Header;
    result = soap_call___tds__GetCapabilities(soap, soap_endpoint, NULL, &abi_req, &abi_resp);
    if(result != SOAP_OK || abi_resp.Capabilities == NULL)
    {
        printf("soap error: %d--%d, %s, %s\n", __LINE__, soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
        goto onvif_OptPTZ_end;
    }

if(abi_resp.Capabilities->Media)
    {
//        printf("Media: XAddr: (%s)\n", abi_resp.Capabilities->Media->XAddr);
        strGetToken = abi_resp.Capabilities->Media->XAddr;
        strOptPtz = abi_resp.Capabilities->PTZ->XAddr;
    }

_trt__GetProfiles request_pro;
    _trt__GetProfilesResponse reponse_pro;
    memset(&request_pro,0,sizeof(request_pro));
    memset(&reponse_pro,0,sizeof(reponse_pro));
    soap->header = &Header;
    result = soap_call___trt__GetProfiles(soap, strGetToken, NULL, &request_pro, &reponse_pro);
    if(SOAP_OK != result)
    {
        printf("soap error: %d--%d, %s, %s\n", __LINE__, soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
        goto onvif_OptPTZ_end;
    }

_tptz__RelativeMove ptz_req;
    _tptz__RelativeMoveResponse ptz_resp;

memset(&ptz_req, 0x0, sizeof(ptz_req));
    memset(&ptz_resp, 0x0, sizeof(ptz_resp));
    
//    printf("__sizeProfiles: %d\n", reponse_pro.__sizeProfiles);
//    printf("token: %s\n", reponse_pro.Profiles->token);
    ptz_req.ProfileToken = reponse_pro.Profiles->token;
    ptz_req.Translation = (struct tt__PTZVector *)soap_malloc(soap, sizeof(tt__PTZVector));
    memset(ptz_req.Translation, 0x0, sizeof(tt__PTZVector));
    ptz_req.Translation->PanTilt = (struct tt__Vector2D *)soap_malloc(soap, sizeof(tt__Vector2D));
    memset(ptz_req.Translation->PanTilt, 0x0, sizeof(tt__Vector2D));
    ptz_req.Translation->Zoom = (struct tt__Vector1D *)soap_malloc(soap, sizeof(tt__Vector1D));
    memset(ptz_req.Translation->Zoom, 0x0, sizeof(tt__Vector1D));

if(move_step >= 1)
    {
        move_step = 0.99999;
    }

switch(commond)
    {
        case PTZ_LEFT:
            ptz_req.Translation->PanTilt->x = move_step;
            break;
        case PTZ_RIGHT:
            ptz_req.Translation->PanTilt->x = -move_step;
            break;
        case PTZ_UP:
            ptz_req.Translation->PanTilt->y = -move_step;
            break;
        case PTZ_DOWN:
            ptz_req.Translation->PanTilt->y = move_step;
            break;
        case PTZ_LEFTUP:
            ptz_req.Translation->PanTilt->x = move_step;
            ptz_req.Translation->PanTilt->y = -move_step;
            break;
        case PTZ_LEFTDOWN:
            ptz_req.Translation->PanTilt->x = move_step;
            ptz_req.Translation->PanTilt->y = move_step;
            break;
        case PTZ_RIGHTUP:
            ptz_req.Translation->PanTilt->x = -move_step;
            ptz_req.Translation->PanTilt->y = -move_step;
            break;
        case PTZ_RIGHTDOWN:
            ptz_req.Translation->PanTilt->x = -move_step;
            ptz_req.Translation->PanTilt->y = move_step;
            break;
        case PTZ_ZOOMIN:
            ptz_req.Translation->Zoom->x = move_step;
            break;
        case PTZ_ZOOMOUT:
            ptz_req.Translation->Zoom->x = -move_step;
            break;
        default:
            goto onvif_OptPTZ_end;
        break;
    }

soap->header = &Header;
    result = soap_call___tptz__RelativeMove(soap, strOptPtz, NULL, &ptz_req, &ptz_resp);
    if(SOAP_OK == result)
    {
        printf("RelativeMove----OK\n");
    }
    else
    {
        printf("RelativeMove----faild\n");
        printf("soap error: %d--%d, %s, %s\n", __LINE__, soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
    }

onvif_OptPTZ_end:

soap_destroy(soap);
    soap_end(soap);
    soap_free(soap);

return result;
}

ONVIF PTZ云台控制--RelativeMove相关推荐

  1. JAVA实现onvif的ptz控制_使用Onvif协议进行设备PTZ云台控制

    接上一篇 使用Onvif协议最重要的应用就是对设备进行PTZ云台控制,PTZ控制包含转动.变焦等,这里我们主要讨论常用的转动和变焦(也就是放大缩小) 流程 要进行设备PTZ控制,我们首先需要获取到设备 ...

  2. SkeyeVSS国标视频汇聚云服务使用Onvif、GB28181协议对监控摄像机设备进行PTZ云台控制

    SkeyeVSS平台可在复杂的网络环境中,将分散的各类视频资源进行统一汇聚.整合.集中管理,实现视频资源的鉴权管理.按需调阅.全网分发.智能分析等.平台可支持多协议.多类型设备接入,包括国标GB281 ...

  3. RTSP/Onvif安防网络摄像头无插件直播流媒体服务EasyNVR如何实现网络摄像机Onvif/RTSP接入直播与云台控制

    什么是Onvif协议 ONVIF规范描述了网络视频的模型.接口.数据类型以及数据交互的模式.并复用了一些现有的标准,如WS系列标准等.ONVIF规范的目标是实现一个网络视频框架协议,使不同厂商所生产的 ...

  4. ONVIF协议开发之网络摄像头云台控制(C版)

    在之前的文章中(<python-onvif实现客户端控制相机云台>),介绍过用python实现基于onvif协议的相机云台控制,考虑到嵌入式端的执行效率问题,还是需要实现C/C++版本的接 ...

  5. 传统安防监控摄像头Onvif云台控制直播流如何转换成GB/T28181对接到国标视频平台公安内网

    传统安防监控摄像头Onvif云台控制如何转换成GB/T28181 1.应用背景 2.部署流媒体服务 2.1.Onvif探测添加 2.1.1.通道编辑 2.2.视频广场播放 2.3.云台操作 3.GB/ ...

  6. 【疑难解决】RTSP协议视频流媒体平台EasyNVR调用云台控制接口返回400报错的问题处理

    网络摄像头RTSP协议视频直播平台是TSINGSEE青犀视频全线产品中最先支持ONVIF协议的平台,可以通过ONVIF进行云台控制. 在用户使用EasyNVR调用云台控制的接口时,发现会返回400的报 ...

  7. Onvif协议学习:14、球机云台控制PTZ

    Onvif协议学习:14.球机云台控制PTZ 文章目录 Onvif协议学习:14.球机云台控制PTZ 一.介绍 二.代码实现 八个方向.放下及缩小控制 聚焦控制 原文链接:https://blog.c ...

  8. ONVIF PTZ控制海康云台相机

    之前帮一个算法朋友弄的 ONVIF PTZ控制海康云台相机代码在无人车上的应用. 主要是鉴权没弄过,折腾onvif的人肯定会碰到,所以特别记录一下. 开始本来是在X64的WIN32或ubuntu工控机 ...

  9. Go语言实现Onvif客户端:8、摄像头PTZ控制(云台控制)

    Go语言实现Onvif客户端:8.摄像头PTZ控制(云台控制) 文章目录 Go语言实现Onvif客户端:8.摄像头PTZ控制(云台控制) 1.PTZ简单再介绍 2.代码 3.结果 1.PTZ简单再介绍 ...

最新文章

  1. 对 android apk 进行重新签名操作
  2. 基于PyQt5的快速开发框架QFramer
  3. 疫情影响海外净利润?海尔智家的回答出人意料
  4. python里面的pip是什么意思_Python-pip和conda有什么区别?
  5. 温州大学《机器学习》课程课件和视频(四)朴素贝叶斯
  6. 快速幂(Fast_Power)
  7. 慎用url重写(转)
  8. 百老汇原版音乐剧《摇滚学校》2月开启中国巡演
  9. Python中字符串的startswith()和endswith()方法
  10. 各j2ee web层框架比较(转)
  11. 在 Mac 中 使用 Safari 常出现「此网页正使用大量内存...」如何修复?
  12. TOGAF9.2企业架构师考试小记
  13. DM8与Oracle关于模式、用户等概念的分析
  14. 割平面法 matlab,割平面法matlab
  15. java POI excel导出自定义分页问题
  16. mybatis-plus关联查询,一对一、一对多。
  17. matlab信息隐藏图片,信息隐藏 实验二 BMP 图像信息隐藏
  18. UE4 简单记录EQS的使用方法
  19. 企业数据备份,需要多少容量和性能满足?
  20. WordPress 文章点赞

热门文章

  1. Word2003常用快捷键
  2. Vista下使用非兼容外设(扫描仪等)
  3. R1 协议:基于以太坊的去中心化交易协议
  4. 调用mathpix api识别图片中的公式
  5. ASEMI场效应管7N60,7N60详细参数,7N60应用领域
  6. 无聊乱做的一个线连线的功能()蓝图的(_杰森大师)
  7. 星耀裂变:社群运营的方法和技巧,搭建私域的必要性!
  8. 详解JAVA类加载机制
  9. 文件误删一键恢复办法
  10. 计算机word考试试题模板,职称计算机考试Word2007模块考试题库