如何通过gsoap实现onvif CreatePullPointSubscription操作

问题描述

请参考onvif核心规范:如果订阅被接受,则响应中包含对以下内容的WS-EndpointReference: 实例化拉点。该WS-Endpoint提供了PullMessages操作,该操作是 客户端用来检索通知

但是我看不到关于实例化拉点的代码,而且我也不知道如何实现它。这是我的编码。

SOAP_FMAC5 int SOAP_FMAC6 __tev__CreatePullPointSubscription(struct soaP* soap,struct _tev__CreatePullPointSubscription *tev__CreatePullPointSubscription,struct _tev__CreatePullPointSubscriptionResponse *tev__CreatePullPointSubscriptionResponse)
{
    tev__CreatePullPointSubscriptionResponse->SubscriptionReference.Address =  (char *)soap_malloc(soap,sizeof(char) * 128);
    strcpy(tev__CreatePullPointSubscriptionResponse->SubscriptionReference.Address,"http://192.168.12.1/Subscription?Idx=0");

    tev__CreatePullPointSubscriptionResponse->wsnt__CurrentTime=time(NULL);
    tev__CreatePullPointSubscriptionResponse->wsnt__TerminationTime=tev__CreatePullPointSubscriptionResponse->wsnt__CurrentTime+60;

    return SOAP_OK;
}

有人能照亮我吗?预先谢谢你。

解决方法

void CreatePullPointSubscription() {
    struct soap *m_soap = soap_new();
    m_soap->connect_timeout = SOAP_REQUEST_TIMEOUT_IN_SECONDS;
    m_soap->recv_timeout = SOAP_REQUEST_TIMEOUT_IN_SECONDS;
    m_soap->send_timeout = SOAP_REQUEST_TIMEOUT_IN_SECONDS;

    PullPointSubscriptionBindingProxy subscriptionProxy(m_soap);
    subscriptionProxy.soap_endpoint = xAddr;
    if (addCredentialsToCall(m_soap)) {   
        _tev__CreatePullPointSubscription request;
        _tev__CreatePullPointSubscriptionResponse response;
        auto ret = subscriptionProxy.CreatePullPointSubscription(&request,response);
        if (ret != SOAP_OK) {
            soap_stream_fault(m_soap,std::cerr);
        } else {
            auto address = response.SubscriptionReference.Address;
            std::cout << address << std::endl;
            std::cout << "Subscription metadata: " << response.SubscriptionReference.Metadata << std::endl;
            std::cout << "Termination time " << response.wsnt__TerminationTime << std::endl;
            std::cout << "Current time " << response.wsnt__CurrentTime << std::endl;

            std::string uuid = std::string(soap_rand_uuid(m_soap,"urn:uuid:"));
            struct SOAP_ENV__Header header;
            header.wsa5__MessageID = (char *) uuid.c_str();
            header.wsa5__To = response.SubscriptionReference.Address;
            m_soap->header = &header;

                if (addCredentialsToCall(m_soap)) {
                    _tev__PullMessages tev__PullMessages;
                    tev__PullMessages.Timeout = "PT600S";
                    tev__PullMessages.MessageLimit = 100;
                    _tev__PullMessagesResponse tev__PullMessagesResponse;

                    auto ret = subscriptionProxy.PullMessages(&tev__PullMessages,tev__PullMessagesResponse);
                    for (auto msg : tev__PullMessagesResponse.wsnt__NotificationMessage) {
                        std::cout << "\tMessage is :" << msg->Topic->__mixed << std::endl;
                    }

                } else {
                    std::cout << "Couldn't set credentials!!!" << std::endl;
                }
            }
        }
    
        subscriptionProxy.destroy();
}

This worked for me atleast to pull the event initializers.

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...