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; }
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; }
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; }