5 char sercer_addr[] = "http://172.168.0.211/onvif/device_service"; //设备搜索得到的地址
106
107 struct SOAP_ENV__Header header;
108 struct soap* soap = ONVIF_Initsoap(&header, NULL, NULL, 5);
109
110 struct _tds__GetCapabilities *req;
111 struct _tds__GetCapabilitiesResponse *Response;
112
113 if(NULL == (req = (struct _tds__GetCapabilities *)calloc(1,sizeof(struct _tds__GetCapabilities))))
114 {
115 printf("calloc is error \n");
116 ret = -1;
117 return ret;
118 }else{
119 req->__sizeCategory = 1;
120 req->Category = (enum tt__CapabilityCategory *)soap_malloc(soap, sizeof(int));
121 *(req->Category) = (enum tt__CapabilityCategory)5; //5表示:tt__CapabilityCategory__Media
122
123 ONVIF_SetAuthInfo(soap,"admin","hk123456"); //鉴权,输入摄像头的用户名、密码
124 ret = soap_call___tds__GetCapabilities(soap, sercer_addr, NULL,req, Response);
125 if(soap->error){
126 ret = -1;
127 printf("soap error: %d, %s, %s\n", soap->error, *soap_faultcode(soap), *soap_faultstring(soap));
128 return ret;
129 }else{;
130 if(NULL != Response->Capabilities)
131 {
132 if (Response->Capabilities->Media != NULL){
133 if (Response->Capabilities->Media->XAddr != NULL){
134 printf(" media_addr: %s \n", Response->Capabilities->Media->XAddr);
135 }
136 }
137 }
138 }
139 }
140
141 if(NULL != req)
142 {
143 free(req);
144 req = NULL;
145 }
146
147 ONVIF_soap_delete(soap);
148 return ret;
149 }
在编译之前要把:stdsoap2.c soapC.c md5.c dom.c mecevp.c smdevp.c threads.c wsaapi.c wsseapi.c soapClient.c 把这些.c 还有有些配套的.h 拷贝到当前工作目录下。
如果出现以下错误要在编译的时候加:-DWITH_OPENSSL
/tmp/cccao7U5.o:在函数‘soap_mec_init’中: mecevp.c:(.text+0xe):对‘soap_ssl_init’未定义的引用 /tmp/ccV2yl3Q.o:在函数‘soap_smd_init’中: smdevp.c:(.text+0x24c):对‘soap_ssl_init’未定义的引用
编译:gcc -o test get_GetCapabilities_test.c stdsoap2.c soapC.c md5.c dom.c mecevp.c smdevp.c threads.c wsaapi.c wsseapi.c soapClient.c -I import/ -DWITH_OPENSSL -lssl -lcrypto -ldl
结果:成功得到我们想要的媒体地址
|