Example #1
0
int TalkbackRtcp::rtcp_init_transport(int cast_type, int protocal, int chn_port)
{
    int sock=-1;
    if(protocal == RTP_TRANSPORT_UDP && cast_type==RTP_UNICAST){
        sock=SOCK_udp_init(NULL, chn_port,RTSP_SOCK_TIMEOUT);
    }else if(protocal == RTP_TRANSPORT_TCP && cast_type==RTP_UNICAST){
        VLOG(VLOG_DEBUG,"rtsp over tcp");
    }else if(protocal == RTP_TRANSPORT_UDP && cast_type==RTP_MULTICAST){
        VLOG(VLOG_ERROR,"unsupport transport: %s,%s",(protocal == RTP_TRANSPORT_TCP) ? "tcp" : "udp",
            (cast_type==RTP_MULTICAST) ? "multicast" : "unicast");
    }else{
        VLOG(VLOG_ERROR,"unsupport transport: %s,%s",(protocal == RTP_TRANSPORT_TCP) ? "tcp" : "udp",
            (cast_type==RTP_MULTICAST) ? "multicast" : "unicast");
    }
    return sock;
}
Example #2
0
File: gb28181.c Project: LinLL/ipc
int gb28181_data_proc(pSipSession s)
{	
	char ip[32];
	int port,payloadtype;

	sip_parse_siphead(&s->recv_siphead,s->recvbuf);
	if(0 == strncmp(s->recv_siphead.sh_ReqLine.cmd,"MESSAGE",strlen("MESSAGE")))
	{
		TRACE("\033[32mGet a %s 2 parse\033[0m\n",s->recv_siphead.sh_ContentType.content_type);
		if(0 == strncmp(s->recv_siphead.sh_ContentType.content_type,"Application/MANSCDP+xml",strlen("Application/MANSCDP+xml")))
		{
			if( 0 ==  s->run_msg_loop)
			{
				char *data_ptr = strstr(s->recvbuf,"\r\n\r\n") + 4;
				s->xml_str = strdup(data_ptr);	
				char *cmdtype = s->get_tagvalue(s->xml_str,"CmdType");		
				if(NULL ==  s->get_tagvalue(s->xml_str,"PTZCmd")
						&& NULL == s->get_tagvalue(s->xml_str,"TeleBoot")
						&& 0 != strcmp("Alarm",cmdtype))
				{
					s->pack_msg(s,MSG_200,NULL);
					TRACE("echo 200;Message need 4 steps way\n");		
					sendto(s->sock,s->sendbuf,strlen(s->sendbuf),\
							0,(struct sockaddr*)&s->server,sizeof(s->server));
				}				
				pthread_t msg;
				pthread_create(&msg,NULL,&gb28181_msg_loop,s);
				pthread_detach(msg);
			}
		}
	}
	else if(0 == strncmp(s->recv_siphead.sh_EchoLine.msg_code,"401",3))
	{
		if(s->auth_status == AUTH_S_REG)
		{
			s->pack_msg(s,MSG_RE_AUTH,NULL);
			TRACE("401:::Re_auth\n");
			s->auth_status = AUTH_S_401;
		}
	}
	else if(0 == strncmp(s->recv_siphead.sh_EchoLine.msg_code,"200",3))
	{
		if((0 == s->online) && s->auth_status == AUTH_S_REG_AGAIN)
		{//this is auth success
			GB_NOTIFY("200:::AUTH success time:%d\n",(int)time(NULL));
			//FIXME the time on board is UTC time
			TRACE("ServerTime:%04d-%02d-%02d %02d:%02d:%02d.%03d\n",
					s->recv_siphead.sh_Date.YYYY,s->recv_siphead.sh_Date.MM,
					s->recv_siphead.sh_Date.DD,
					s->recv_siphead.sh_Date.hh,
					s->recv_siphead.sh_Date.mm,
					s->recv_siphead.sh_Date.ss,
					s->recv_siphead.sh_Date.mmm);
			char time_str[32];
			sprintf(time_str,"date -s \"%04d-%02d-%02d %02d:%02d:%02d\"",
					s->recv_siphead.sh_Date.YYYY,
					s->recv_siphead.sh_Date.MM,
					s->recv_siphead.sh_Date.DD,
					s->recv_siphead.sh_Date.hh,
					s->recv_siphead.sh_Date.mm,
					s->recv_siphead.sh_Date.ss);
			system(time_str);

			s->auth_status = AUTH_S_SUCCESS;
			s->online = 1;
			pthread_t hb;
			pthread_create(&hb,NULL,&gb28181_heartbeat_loop,s);
			pthread_detach(hb);
		}
		else if((0 != s->online) && s->auth_status == AUTH_S_REG_AGAIN)
		{
			GB_NOTIFY("200:::Login out success:%d\n",(int)time(NULL));
			s->auth_status = AUTH_S_SUCCESS;
			s->online = 0 ;
		}
		else if((0 != s->online) && s->auth_status == AUTH_S_SUCCESS)
		{// heartbeat or other msg echo 200
			if((strlen(s->heartbeat_callid) > 0)&&(0 == strncmp(s->recv_siphead.sh_CallID.call_id,s->heartbeat_callid,
							strlen(s->heartbeat_callid)))){
				TRACE("Get A HeartBeat callID:%s\n",s->heartbeat_callid);
			}else{
				s->run_msg_loop = 0;
			}
		}		
	}
	else if(0 == strncmp(s->recv_siphead.sh_ReqLine.cmd,"INVITE",6))
	{
		SessionDesc_t *sdp=NULL;
		SipRtpSession_t *srtp=NULL;
		TRACE("sdp ###%s\n",strstr(s->recvbuf,"\r\n\r\n") + 4);
		TRACE("Get a media request\n");
		if(SIPRTP_session_find(s->recv_siphead.sh_CallID.call_id)==NULL){
			sdp = (void *)SDP_decode(strstr(s->recvbuf,"\r\n\r\n") + 4);
			srtp=SIPRTP_session_add(s->recv_siphead.sh_CallID.call_id,g_SipRtpPort++,sdp,s);
			pthread_t invite;
			pthread_create(&invite,NULL,gb28181_invite_loop,srtp);
			pthread_detach(invite);
		}
	}
	else if(0 == strncmp(s->recv_siphead.sh_ReqLine.cmd,"ACK",3))
	{
		TRACE("Get a media ACK\n");
		SessionDesc_t *sdp=NULL;
		SipRtpSession_t *srtp=NULL;
		Rtp_t *rtp=NULL;
		if((srtp=SIPRTP_session_find(s->recv_siphead.sh_CallID.call_id))!=NULL){
			sdp = (SessionDesc_t *)srtp->data.context;
			TRACE("ssrc:%u",sdp->media[0].ssrc);
			SDP_get_h264_info(sdp,&payloadtype,ip,&port);
			TRACE("payloadtype:%d,ip:%s:%d\n",payloadtype,ip,port);
			int sock=SOCK_udp_init(srtp->data.port,3000);
			rtp = (void *)RTP_server_new(sdp->media[0].ssrc,payloadtype,RTP_TRANSPORT_UDP,FALSE,sock,ip,port);
			SIPRTP_session_set_context(srtp,rtp);
			SDP_cleanup(sdp);
#if 0
			pthread_t thread_rtp;
			pthread_create(&thread_rtp,NULL,gb28181_rtp_loop,srtp);
#endif
		}
	}
	else if(0 == strncmp(s->recv_siphead.sh_ReqLine.cmd,"BYE",3))
	{		
		SipRtpSession_t *srtp=NULL;
		s->pack_msg(s, MSG_200,NULL);
		TRACE("BYE:\n%s\n",s->sendbuf);
		sendto(s->sock,s->sendbuf,strlen(s->sendbuf),\
				0,(struct sockaddr*)&s->server,sizeof(s->server));		
		if((srtp=SIPRTP_session_find(s->recv_siphead.sh_CallID.call_id))!=NULL){
#if 1
			RTP_destroy((Rtp_t *)srtp->data.context);
			SIPRTP_session_del(srtp->data.id);
#else
			SIPRTP_session_toggle(srtp,FALSE);
#endif
		}
	}
	return 0;
}
Example #3
0
void* JASTS_SEARCH_proc(void *para)
{
	int ret;
	fd_set read_set;
	struct timeval timeout;
	char dst_ip[20],mine_ip[20];
	int dst_port,mine_port;
	char buff[1024];
	char msg[1024];
	Jast_t *jast=NULL;
	JastSession_t *session=NULL;
	const char *format="JAST/1.0 200 OK\r\n"\
			"Location: %s:%d\r\n"\
			"\r\n";

	pthread_detach(pthread_self());
	printf("JAST server enter!!!!!!!!\n");

    server_fd=SOCK_udp_init(JAST_DISCOVERY_SPORT,JAST_SOCK_TIMEOUT);
	if(server_fd < JAST_RET_FAIL) return NULL;
#ifndef JAST_USE_BROADCAST
	if(SOCK_add_membership(server_fd,JAST_MULTICAST_ADDR) < JAST_RET_FAIL) return NULL;
	system("route add -net 224.0.0.0 netmask 224.0.0.0 dev eth0");
#endif
	do {
		FD_ZERO(&read_set);
		FD_SET(server_fd,&read_set);
		timeout.tv_sec = 0;
		timeout.tv_usec = 1000*50;
		ret = select(server_fd + 1,&read_set,NULL,NULL,&timeout);
		if(ret < 0){
			printf("JAST server select failed!\n");
			return NULL;
		}else if(ret == 0){
			// timeout
			//printf("select timeout!!\n");
		}else{
			if(FD_ISSET(server_fd,&read_set) == true){
				ret = SOCK_recvfrom(server_fd,dst_ip,&dst_port,buff,sizeof(buff));
				if(ret < 0) return NULL;
				buff[ret]=0;
				VLOG(VLOG_DEBUG,"recv %d ok,recv data:\n%s\n",ret,buff);
				if(memcmp(buff,"DISCOVERY * JAST/1.0",strlen("DISCOVERY * JAST/1.0"))==0){
					printf("Discovery from %s:%d!\n",dst_ip,dst_port);
					// send response
					//SOCK_getsockname(server_fd,mine_ip);
					SOCK_gethostname(mine_ip);

					// init a jast session
					if((session=JAST_session_find(dst_ip)) == NULL){
						mine_port = g_JastServerPort;
						sprintf(msg,format,mine_ip,mine_port);
						g_JastServerPort++;
						//
						printf("add new session\n",dst_ip,dst_port);
						jast=JAST_server_init(dst_ip,mine_port);
						if(jast == NULL) return NULL;
						session=JAST_session_add(dst_ip,jast->sock,jast);
						if(session == NULL) return NULL;
					}else{
						jast = (Jast_t *)session->data.context;
						jast->bLogin = false;
						//
						sprintf(msg,format,jast->ip_me,jast->port_me);
						printf("session:%s exist!!!\n",dst_ip);
					}
					VLOG(VLOG_DEBUG2,"ack:\n%s\n",msg);
					ret = SOCK_sendto(server_fd,dst_ip,dst_port,msg,strlen(msg));
					if( ret == JAST_RET_FAIL) break;
				}
			}else{
				printf("JAST select:something wrong!\n");
				return NULL;
			}
		}
    } while (m_toggle);
	
	printf("JAST server exit!!!!!!!!\n");
	
    return (void *)1;
}