yate--sip server的学习过程

时间:2021-06-16 00:31:08


    不知道有没有人也在学习yate这个这东西,如果有的话,并且感兴趣的话,可以加一下好友(qq:905568425)一起讨论一下学习心得:


    由于以前没有自己独立搞过大型的C++工程,所以这次面对这个拥有比较完善的C++库的yate工程就显得有些束手无策了,加上在网上可以参考的资料基本是没有的,所以不得一点一点开始看起,从main()入口函数看起,看到client如何注册上server,以及Invite请求和200OK的回复,RTP传输Media数据,了解大致的流程就花了比较长的时间了,具体到每个模块里面的时间不多,所以记录下今天下午看到的ysipchan里面的Invite请求的流程。


    首先我们先不涉及到Register流程,直接进入Invite流程,我们通过抓包或者日志输出可以看到的是:client A  发送了Invite的消息到 sip server,里面包含的信息有以下几个部分:

INVITE sip:zhaosheng@192.168.1.77 SIP/2.0
Max-Forwards: 20
Via: SIP/2.0/UDP 192.168.1.139:5060;rport;branch=z9hG4bK542329594
From: <sip:dragonwake@192.168.1.77>;tag=1008295650
To: <sip:zhaosheng@192.168.1.77>
Call-ID: 1350821487@192.168.1.77
CSeq: 27 INVITE
User-Agent: YATE/5.3.0
Contact: <sip:dragonwake@192.168.1.139:5060>
Allow: ACK, INVITE, BYE, CANCEL, OPTIONS, INFO
Content-Type: application/sdp
Content-Length: 506

v=0
o=yate 1407827030 1407827030 IN IP4 192.168.1.139
s=SIP Call
c=IN IP4 192.168.1.139
t=0 0
m=audio 17652 RTP/AVP 0 8 3 11 98 97 102 103 104 105 106 101
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:3 GSM/8000
a=rtpmap:11 L16/8000
a=rtpmap:98 iLBC/8000
a=fmtp:98 mode=20
a=rtpmap:97 iLBC/8000
a=fmtp:97 mode=30
a=rtpmap:102 SPEEX/8000
a=rtpmap:103 SPEEX/16000
a=rtpmap:104 SPEEX/32000
a=rtpmap:105 iSAC/16000
a=rtpmap:106 iSAC/32000
a=rtpmap:101 telephone-event/8000
a=ptime:30


在上面我们可以看到Invite的请求方式dragonwake,请求zhaosheng这个用户,然后client对应的ip和port也都有,c=IN IP4 192.168.1.139就是请求方对应的IP,然后m=audio 17652显示的是media的类型和传输端口,类似的,server在接受到Invite消息后,会对消息进行处理,处理的大致流程如下:

void YateSIPEndPoint::run()函数里面会接受到一个