前面步骤是为获取RTSP作准备,这里需要使用上述生成的文件,调用相关接口获取RTSP地址
3.编写实现方法获取RTSP
废话不多说,直接上我的代码
GetRTSP.cpp
#include "wsdd.h"
#include "wsseapi.h"
#include "wsaapi.h"
#include <stdio.h>
#include <string.h>
#define ONVIF_USER "XXXX" //用户名
#define ONVIF_PASSWORD "******" //密码
#define M 150
char str1[M],str2[M];
//此处的结构体为输出的rtsp字符串做准备
typedef struct stack{
char *Data[M];
int Top;
}Stack
Stack stk;
int push(char *c){
if (stk.Top==M-1){
printf("栈满");
}
else {
stk.Data[++(stk.Top)]=c;
return 0;
}
}
char *pop(){
if(stk.Top==-1){
printf("栈空");
}
else{
char *c;
c=stk.Data[stk.Top--];
return c;
}
}
int HasDev = 0;//the number of devices
//初始化soap函数
static struct soap* ONVIF_Initsoap(struct SOAP_ENV__Header *header, const char *was_To, const char *was_Action, int timeout)
{
struct soap *soap = NULL;
unsigned char macaddr[6];
char _HwId[1024];
unsigned int Flagrand;
soap = soap_new();
if(soap == NULL)
{
printf("[%d]soap = NULL\n", __LINE__);
return NULL;
}
soap_set_namespaces( soap, namespaces);
//超过1秒钟没有数据就退出
if (timeout > 0)
{
soap->recv_timeout = timeout;
soap->send_timeout = timeout;
soap->connect_timeout = timeout;
}
else
{
//如果外部接口没有设备默认超时时间的话,我这里给了一个默认值3s
soap->recv_timeout = 3;
soap->send_timeout = 3;
soap->connect_timeout = 3;
}
soap_default_SOAP_ENV__Header(soap, header);
// 为了保证每次搜索的时候MessageID都是不相同的!因为简单,直接取了随机值
srand((int)time(0));
Flagrand = rand()%9000 + 1000; //保证四位整数
macaddr[0] = 0x1; macaddr[1] = 0x2; macaddr[2] = 0x3; macaddr[3] = 0x4; macaddr[4] = 0x5; macaddr[5] = 0x6;
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]);
header->wsa__MessageID =(char *)malloc