#include <iostream>
#include "wsseapi.h"
#include "namespace.h"
#include "soapDeviceBindingProxy.h"
#include "soapMediaBindingProxy.h"
using namespace std;
typedef struct profile_device_s{
std::string addr;
std::string username;
std::string password;
std::string stream1;
std::string stream2;
}profile_device;
static void do_onvif_complete(profile_device& pd) {
int ec = SOAP_OK;
std::cerr << "================================================================" << std::endl;
std::cerr << "handle " << pd.addr << std::endl;
DeviceBindingProxy device;
device.DeviceBindingProxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);
device.recv_timeout = 3;
device.soap_endpoint = pd.addr.c_str();
if (pd.username.size() > 0 || pd.password.size() > 0) {
soap_wsse_add_Security(&device);
soap_wsse_add_UsernameTokenDigest(&device, NULL, pd.username.c_str(), pd.password.c_str());
}
_tds__GetCapabilities capabilitiesRequest;
_tds__GetCapabilitiesResponse capabilitiesResponse;
capabilitiesRequest.Category.push_back(tt__CapabilityCategory__All);
ec = device.GetCapabilities(&capabilitiesRequest, capabilitiesResponse);
if (ec != SOAP_OK) {
std::cerr << "device.GetCapabilities fail." << std::endl;
device.soap_stream_fault(std::cerr);
return;
}
// else {
// std::cerr << "device.GetCapabilities success." << std::endl;
// std::cerr << "Media->XAddr: " << tds__GetCapabilitiesResponse.Capabilities->Media->XAddr << std::endl;
// }
MediaBindingProxy media;
media.MediaBindingProxy_init(SOAP_IO_DEFAULT, SOAP_IO_DEFAULT);
media.recv_timeout = 3;
media.soap_endpoint = capabilitiesResponse.Capabilities->Media->XAddr.c_str();
_trt__GetProfiles profilesRequest;
_trt__GetProfilesResponse profilesResponse;
if (pd.username.size() > 0 || pd.password.size() > 0) {
soap_wsse_add_Security(&media);
soap_wsse_add_UsernameTokenDigest(&media, NULL, pd.username.c_str(), pd.password.c_str());
}
// std::cerr << "================================================================" << std::endl;
ec = media.GetProfiles(&profilesRequest, profilesResponse);
if (ec != SOAP_OK) {
std::cerr << "media.GetProfile fail." << std::endl;
media.soap_stream_fault(std::cerr);
return;
}
int idx = 0;
std::cerr << "media.GetProfile success." << std::endl;
for (auto i = profilesResponse.Profiles.begin(); i != profilesResponse.Profiles.end(); i++, idx++) {
std::cerr << "----------------------------------------------" << std::endl;
std::cerr << "Profiles Name: " << (*i)->Name << std::endl;
std::cerr << "Profiles Taken: " << (*i)->token << std::endl;
_trt__GetStreamUri streamUriRequest;
_trt__GetStreamUriResponse streamUriResponse;
tt__Transport transport;
transport.Protocol = tt__TransportProtocol__RTSP;
tt__StreamSetup streamSetup;
streamSetup.Stream = tt__StreamType__RTP_Unicast;
streamSetup.Transport = &transport;
streamUriRequest.StreamSetup = &streamSetup;
streamUriRequest.ProfileToken = (*i)->token;
if (pd.username.size() > 0 || pd.password.size() > 0) {
soap_wsse_add_Security(&media);
soap_wsse_add_UsernameTokenDigest(&media, NULL, pd.username.c_str(), pd.password.c_str());
}
ec = media.GetStreamUri(&streamUriRequest, streamUriResponse);
if (ec != SOAP_OK) {
media.soap_stream_fault(std::cerr);
} else {
std::string uri = streamUriResponse.MediaUri->Uri;
if (idx == 0) {
pd.stream1 = uri;
}
if (idx == 1) {
pd.stream2 = uri;
}
std::cerr << "media.GetStreamUri success." << std::endl;
}
}
}
int main() {
profile_device pd;
pd.addr="http://192.168.20.165:80/onvif/device_service";
pd.username="admin";
pd.password="admin888";
do_onvif_complete(pd);
std::cerr << "uri1: " << pd.stream1 << std::endl;
std::cerr << "uri2: " << pd.stream2 << std::endl;
return 1;
}