/*
* Rtsp_Client.c
*
* Created on: 2021年3月31日
* Author: zdp
*/
#include "Md5.h"
#include "Rtsp_Client.h"
#include "RingBuffer.h"
#define HIKVISION 0
char mcast_addr[] = "232.231.110.2";
#if HIKVISION
int serverPort = 554;
char serverIP[] = "192.168.1.68";
char URL[] = "rtsp://192.168.1.68:554/h264/main/av_stream";
char *METHOD[] = {"DESCRIBE", "OPTIONS", "DESCRIBE", "DESCRIBE", "SETUP", "PLAY", "PAUSE", "TEARDOWN"};//设置不合理 需更改
#else
int serverPort = 8554;
char serverIP[] = "172.17.164.228";
char URL[] = "rtsp://172.17.164.228:8554/out.264";
char *METHOD[] = {"DESCRIBE", "OPTIONS", "DESCRIBE", "SETUP", "PLAY", "PAUSE", "TEARDOWN"};
#endif
char VERSION[] = "RTSP/1.0\r\n";
char UserAgentStr[] = "virtual client player\r\n";
char SuccessfullyReplyStr[] = "RTSP/1.0 200 OK\r\n";
char CseqHeadStr[] = "Cseq: ";
char UserHeadStr[] = "User-Agent: ";
char ApplicationHeadStr[] = "Accept: ";
char TransportHeadStr[] = "Transport: ";
char SessionHeadStr[] = "Session: ";
char RangeHeadStr[] = "Range: ";
int cseqCount=0;
FILE *fp;
unsigned char *StreamBufferPtr;
struct sockaddr_in RTPAddr;
struct sockaddr_in RTCPAddr;
int Rtsp_Init(){
int sockfd;
struct sockaddr_in dest;
/* creat socket for rtsp */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("Socket");
exit(errno);
}
/* init server addr and port */
bzero(&dest, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(serverPort);
if (inet_pton(AF_INET, serverIP, &dest.sin_addr) < 0 ) {
perror(serverIP);
exit(errno);
}
/* connect to server */
if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) {
perror("RTSP Connect error\n");
exit(errno);
}
return sockfd;
}
int Rtsp_Interacte(int sockfd, char *buffer){
int len = 0;
/* OPTION send message to server */
bzero(buffer, MAXBUF + 1);
Handel_OPTION(buffer);
len = send(sockfd, buffer, strlen(buffer), 0);
if (len < 0)
printf("OPTION Reply Msg:\n %s send error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
else
printf("OPTION Reply Msg:\n %s send successfully,total content is %d bytes!\n", buffer, len);
/* OPTION receive message from server */
bzero(buffer, MAXBUF + 1);
len = recv(sockfd, buffer, MAXBUF, 0);
if (len < 0){
printf("OPTION Reply Msg:\n %s receive error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
}
else{
printf("OPTION Reply Msg:\n %s receive successfully,total content is %dbytes!\n", buffer, len);
}
if (memcmp(buffer, SuccessfullyReplyStr, sizeof(SuccessfullyReplyStr) -1) == 0){
Handel_DESCRIBE(buffer, sockfd);
}
else{
printf("the OPTION answer Msg is wrong!\n");
return -1;
}
/* DESCRIBE Reply */
bzero(buffer, MAXBUF + 1);
len = recv(sockfd, buffer, MAXBUF, 0);
if (len < 0){
printf("DESCRIBE Reply Msg:\n %s receive error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
}
else{
printf("DESCRIBE Reply Msg:\n %s receive successfully,total content is %dbytes!\n", buffer, len);
}
#if HIKVISION
/* send Certification */
Handel_Certification(buffer, sockfd);
/* DESCRIBE Handel_Certification Reply */
bzero(buffer, MAXBUF + 1);
len = recv(sockfd, buffer, MAXBUF, 0);
if (len < 0){
printf("Certificate Reply Msg:\n %s receive error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
}
else{
printf("Certificate Reply Msg:\n %s receive successfully,total content is %dbytes!\n", buffer, len);
}
#endif
if (memcmp(buffer, SuccessfullyReplyStr, sizeof(SuccessfullyReplyStr)-1) == 0){
Handel_SETUP(buffer, sockfd);
}
else{
printf("the DESCRIBE answer Msg is wrong!\n");
return -1;
}
bzero(buffer, MAXBUF + 1);
len = recv(sockfd, buffer, MAXBUF, 0);
if (len < 0){
printf("SETUP Reply Msg:\n %s receive error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
}
else{
printf("SETUP Reply Msg:\n %s receive successfully,total content is %dbytes!\n", buffer, len);
}
return 0;
}
int Rtsp_Request_Play(int sockfd, char *buffer, int *rtpsockfd, int *rtcpsockfd){
int udpPort = 0, len = 0;
char sessionIdTmp[30];
bzero(sessionIdTmp,sizeof(sessionIdTmp));
strsearch(buffer, "Session: ", 9, sessionIdTmp);
if (memcmp(buffer, SuccessfullyReplyStr, sizeof(SuccessfullyReplyStr)-1) == 0)
{
char searchStrTmp[13]="port=";
udpPort=intsearch(buffer,searchStrTmp,5);
if(udpPort==0){
return -1;
}
printf("the udp port is %d\n",udpPort);
bzero(&RTPAddr,sizeof(RTPAddr));
bzero(&RTCPAddr,sizeof(RTCPAddr));
*rtpsockfd = init_udpsocket(udpPort, &RTPAddr, mcast_addr);
*rtcpsockfd = init_udpsocket(udpPort+1, &RTCPAddr, mcast_addr);
Handel_PLAY(buffer, sockfd,sessionIdTmp);
}
else
{
printf("the SETUP answer Msg is wrong!\n");
return -1;
}
bzero(buffer, MAXBUF + 1);
len = recv(sockfd, buffer, MAXBUF, 0);
if (len < 0){
printf("PLAY Reply Msg:\n %s receive error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
}else{
printf("PLAY Reply Msg:\n %s receive successfully,total content is %dbytes!\n", buffer, len);
}
if (memcmp(buffer, SuccessfullyReplyStr, sizeof(SuccessfullyReplyStr)-1) != 0){
printf("the play answer Msg is wrong!\n");
return -1;
}
return 0;
}
int Rtsp_Fun(int sockfd, char *buffer, int rtpsockfd, int rtcpsockfd){
// int len = 0;
// bzero(buffer, MAXBUF + 1);
// Handle_PAUSE(buffer, sockfd, sessionIdTmp);
//
// len = recv(sockfd, buffer, MAXBUF, 0);
// if(len < 0){
// printf("PAUSE Reply Msg:\n %s receive error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
// }
// else{
// printf("PAUSE Reply Msg:\n %s receive successfully,total content is %dbytes!\n", buffer, len);
// }
//
//
// if (memcmp(buffer, successfullyReplyStr, sizeof(successfullyReplyStr)-1) != 0){
// printf("the pause answer Msg is wrong!\n");
// return 0;
// }
//
// bzero(buffer, MAXBUF + 1);
// Handel_Teardown(buffer, sockfd,sessionIdTmp);
// len = recv(sockfd, buffer, MAXBUF, 0);
// if (len < 0){
// printf("teardown Reply Msg:\n %s receive error! error code is %d, error content is %s \n", buffer, errno, strerror(errno));
// }
// else{
// printf("teardown Reply Msg:\n %s receive successfully,total content is %dbytes!\n", buffer, len);
// }
//
// release_udpsocket(rtpsockfd, mcast_addr);
// release_udpsocket(rtcpsockfd, mcast_addr);
return 0;
}
void *Rtsp_Client(){
int sockfd, rtpsockfd, rtcpsockfd;
char buffer[MAXBUF + 1] = {0};
fp = fopen("recv.h264", "wb");
if(fp == NULL) {perror("recv.h264"); return NULL;}
// if(Stream_Buffer_Init() < 0){
// perror("Stream_Buffer_Init()");
// exit(-1);
// }
if((sockfd = Rtsp_Init()) < 0){
perror("Rtsp_Init()");
exit(-1);
}
if(Rtsp_Interacte(sockfd, buffer) != 0){
perror("Rtsp_Interacte()");
exit(-1);
}
if(Rtsp_Request_Play(sockfd, buffer, &rtpsockfd, &rtcpsockfd) != 0){
perror("Rtsp_Request_Play()");
return NULL;
}
while(1){
printf("now,receiving RTP packets data......\n");
// usleep(1000);
proc_udpsocket(rtpsockfd, RTPAddr, 0);
// proc_udpsocket(rtcpsockfd, RTCPAddr, 1);
}
return NULL;
}
void Handel_OPTION(char *inbuffer)
{
char strCseq[5]= {0};
char SendOptResuestStr[100] = {0};
cseqCount++;
//Option request info
strcat(SendOptResuestStr, METHOD[cseqCount]);
strcat(SendOptResuestStr, " ");
strcat(SendOptResuestStr, URL);
strcat(SendOptResuestStr, " ");
strcat(SendOptResuestStr, VERSION);
memcpy(inbuffer, SendOptResuestStr, strlen(SendOptResuestStr));
//Cseq info
strcat(inbuffer, CseqHeadStr);
sprintf(strCseq, "%d", cseqCount);
strcat(inbuffer, strCseq);
strcat(inbuffer, "\r\n");
//user-Agent info
strcat(inbuffer, UserHeadStr);
strcat(inbuffer,UserAgentStr);
strcat(inbuffer, "\r\n");
return;
}
void Handel_DESCRIBE
评论0