seo网站结构优化,wordpress 上传组件,学校网站建设的验收单,网站权限设置getcapabilities:获取能力,主要目的获取设备能力信息(获取媒体服务地址)鉴权#xff1a;但是在调用获取设备能力之前是需要鉴权的。onvif协议规定#xff0c;部分接口需要鉴权#xff0c;部分接口不需要鉴权#xff0c;在调用需要鉴权的接口时不使用鉴权#xff0c;会导致…getcapabilities:获取能力,主要目的获取设备能力信息(获取媒体服务地址)鉴权但是在调用获取设备能力之前是需要鉴权的。onvif协议规定部分接口需要鉴权部分接口不需要鉴权在调用需要鉴权的接口时不使用鉴权会导致接口调用失败。实现鉴权的方式之一可以调用gsoap源码中的 soap_wsse_add_usernametokendigest()函数。要安装依赖库openssl实现代码1 #include 2 #include 3 #include 4 #include 56 #include soaph.h7 #include stdsoap2.h8 #include soapstub.h9 #include wsseapi.h1011 #include wsdd.nsmap //命名空间1213 static struct soap* onvif_initsoap(struct soap_env__header *header, const char *was_to, const char *was_action, int timeout)14 {15 struct soap *soap null; // soap环境变量16 unsigned char macaddr[6];17 char _hwid[1024];18 unsigned int flagrand;1920 soap soap_new();21 if(soap null)22 {23 printf([%d]soap null\n, __line__);24 return null;25 }2627 soap_set_namespaces(soap, namespaces); // 设置soap的namespaces即设置命名空间2829 // 设置超时(超过指定时间没有数据就退出)30 if(timeout 0)31 {32 soap-recv_timeout timeout;33 soap-send_timeout timeout;34 soap-connect_timeout timeout;35 }36 else37 {38 //maximum waittime : 20s39 soap-recv_timeout 20;40 soap-send_timeout 20;41 soap-connect_timeout 20;42 }4344 soap_default_soap_env__header(soap, header);4546 //create sessionid randomly,生成uuid(windows下叫guidlinux下叫uuid)格式为urn:uuid:8-4-4-4-12由系统随机产生47 srand((int)time(0));48 flagrand rand()%9000 8888;49 macaddr[0] 0x1;50 macaddr[1] 0x2;51 macaddr[2] 0x3;52 macaddr[3] 0x4;53 macaddr[4] 0x5;54 macaddr[5] 0x6;55 sprintf(_hwid, urn:uuid:%ud68a-1dd2-11b2-a105-%02x%02x%02x%02x%02x%02x, flagrand, macaddr[0], macaddr[1], macaddr[2],macaddr[3],macaddr[4],macaddr[5]);56 header-wsa__messageid (char *)malloc(100);57 memset(header-wsa__messageid, 0, 100);58 strncpy(header-wsa__messageid, _hwid, strlen(_hwid)); //wsa__messageid存放的是uuid5960 if(was_action ! null)61 {62 header-wsa__action (char*)malloc(1024);63 memset(header-wsa__action, \0, 1024);64 strncpy(header-wsa__action, was_action, 1024); //65 }66 if(was_to ! null)67 {68 header-wsa__to (char *)malloc(1024);69 memset(header-wsa__to, \0, 1024);70 strncpy(header-wsa__to, was_to, 1024);//urn:schemas-xmlsoap-org:ws:2005:04:discovery;71 }72 soap-header header;73 return soap;74 }757677 //释放函数78 void onvif_soap_delete(struct soap *soap)79 {80 soap_destroy(soap); // remove deserialized class instances (c only)81 soap_end(soap); // clean up deserialized data (except class instances) and temporary data82 soap_free(soap); // reset and deallocate the context created with soap_new or soap_copy83 }848586 //鉴权87 static int onvif_setauthinfo(struct soap *soap, const char *username, const char *password)88 {89 int result 0;90 if((null ! username) || (null ! password)){91 soap_wsse_add_usernametokendigest(soap, null, username, password);92 }else{93 printf(un etauth\n);94 result -1;95 }9697 return result;98 }99100101102 int main(int argc,char *argv[])103 {104 int ret 0;105 char sercer_addr[] http://172.168.0.211/onvif/device_service; //设备搜索得到的地址106107 struct soap_env__header header;108 struct soap* soap onvif_initsoap(header, null, null, 5);109110 struct _tds__getcapabilities *req;111 struct _tds__getcapabilitiesresponse *response;112113 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__media122123 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 }140141 if(null ! req)142 {143 free(req);144 req null;145 }146147 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:(.text0xe)对‘soap_ssl_init’未定义的引用/tmp/ccv2yl3q.o在函数‘soap_smd_init’中smdevp.c:(.text0x24c)对‘soap_ssl_init’未定义的引用编译gcc -o test get_uri_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 -pthread结果成功得到我们想要的媒体地址