在SIP编程中,设置SDP的过程很简单,
snprintf (tmp, 4096,
“v=0\r\n”
“o=anonymous 0 0 IN IP4 0.0.0.0\r\n”
“t=1 10\r\n”
“a=username:rainfish\r\n”
“a=password:123\r\n”);
osip_message_set_body (invite, tmp, strlen(tmp));
osip_message_set_content_type (invite, “application/sdp”);
其实SDP只是一个字符串,只需要按照格式写好字符串直接放入SDP里即可。关键是要知道具体意思和如何写SDP,下面主要参看百度文档中兴的SDP协议原理及应用
———-
会话描述 |
格式及举例 |
v=(protocolversion) |
v=0 |
o=(owner/creator and session identifier) |
o=<</FONT>用户名><</FONT>会话id><</FONT>版本><</FONT>网络类型><</FONT>地址类型><</FONT>地址> o=sname12345678900987654321IN IP4126.15.64.3 |
s=(session name) |
会话名 |
i=*(session information) |
会话信息 |
e=*(email address) |
e=zte@isi.edu(generaltext 或e=Mr.Wang |
p=*(phone number) |
p=+86-0755-26773000-7110(wang) orp=+16172536011 |
c=*(connection information-如已经包含在所有媒体中则该行不需要) |
c=<</FONT>网络类型><</FONT>地址信息><</FONT>多点会议包括TTL连接地址:的address>// c=INIP4224.2.13.23/127 c=INIP4224.2.1.1/127/3 |
b=*(bandwidthinformation) |
b=<</FONT>修改量(CTConferenceTotal IASApplication-specificMax)>:<</FONT>带宽 值(kb/s)> b=CT:120 |
|
|
z=*(time zone adjustments) |
时区调整 |
k=*(encryption key) |
k=<</FONT>方法>:<</FONT>密钥>或k=<</FONT>方法> |
a=*(zero or more session attributelines) |
a=<</FONT>属性>或a=<</FONT>属性>:<</FONT>值> |
|
|
t=(timethesessionisactive) |
<</FONT>开始时间><</FONT>结束时间>,单位秒,十进制NTP t=28733974682873404969 |
r=*(zero or more repeat times) |
<</FONT>重复时间><</FONT>活动持续时间以开始时刻为参考的偏移列表>单位秒r=604800366690000或写成r=7d1h025h |
媒体描述 |
|
m=(media name and transportaddress) |
m=<</FONT>媒体><</FONT>端口><</FONT>传送><</FONT>格式列表> m=audio49170RTP/AVP03 协议为RTP,剖面为AVP,参考rtp-parameters.txt |
i=*(mediatitle) |
媒体称呼 |
c=*(connectioninformation) |
如已经包含在会话级描述则为可选 |
b=*(bandwidthinformation |
同c |
k=*(encryptionkey) |
会话级为摸认值,同c |
a=*(zeroormoremediaattributelines) |
两种形式:(也同c)(见后说明)a=如: a=recvonly a=: |
说明:
1. v,o,s,t,m为必须的,其他项为可选;
2. 如果SDP语法分析器不能识别某一类型(Type),则整个描述丢失;
3. 如果“a=”的某属性值不理解,则予以丢失;
4. 整个协议区分大小写;
5. “=”两侧不允许有空格;
6. 会话级的描述就是媒体级描述的缺省值;
7. 所有均格式为=。
SDP各type的详细解释:
会话描述:
1. 协议版本:v=SDP版本 目前为0,没有子版本。
2. 会话源: o<用户名> 用户在发起主机上登录名,如果主机不支持用户标识的概念,则为”-”。
<会话id> 一般为数字串,其分配由创建工具决定,建议用网络时间协议(NTP)时戳,以确保唯 一性。
<版本>该会话公告的版本,供公告代理服务器检测同一会话的若干个公告哪个是最新公告.基本 要求是会话数据修改后该版本值递增,建议用NTP时戳
<网络类型>为文本串”IN”。
<地址类型>“IP4”(可为域名或点分十进制)/”IP6”(域名或压缩文本地址形式)
<地址>按照上述的IP4或者IP6格式写出
3. 会话: s=ISO10646字符表示的会话名
4. 会话信息: v=ISO10646字符表示的会话信息
URIu=能提供会议进一步信息的URI地址
5. Email地址:e=给出会议负责人的联系信息。他不一定是创建会议公告的人。电话号码p=给出会议负责人的
信息,他不一定是创建会议公告的人
6. 连接数据: c=媒体连接数据,会话级为媒体级的默认值
7. 带宽: b=给出会话或媒体所用带宽,单位为kbit/s.修饰语:CT(会议总带宽,表示所有地点所有媒体
的总带宽),AS(应用特定最大带宽,表示一个地点单一媒体带宽)
时间描述:
8 t=见上
9. r=见上
10. 时区调整:z=见上
11. 加密密钥:k=已定义的方法有k=clear:<加密密钥>密钥没有变换 k=base64:<编码密钥>已编码,因为它含有SDP禁用, k=uri:<获得密钥的URI> k=prompt。SDP没有提供密钥但该会话或媒体流是要求加密的。
12. 属性:a= 一个m=行可有多个a=行,SDP建议扩展如下:
会话级:a=cat:<类别>//给出点分层次式会话分类号,供接收方筛选会话 a=keywds:<关键词>//供接收方筛选会话 a=tool:<工具名和版本号>//创建会话描述的工具名和版本号 a=recvonly/sendrecv/sendonly//收发模式 a=type:<会议类型>//有:广播,聚会,主席主持,测试,H.323 a=charset:<字符集>//显示会话名和信息数据的字符集 a=sdplang:<语言标记>//描述所有语言 a=lang:<语言标记>//会话描述的缺省语言或媒体描述的语言 a=framerate:<帧速率>//单位:帧/秒 a=quality:<质量>//视频的建议质量(10/5/0) a=fmtp:<格式><格式特定参数>//定义指定格式的附加参数
媒体级:
a=ptime:<分组时间>//媒体分组的时长(单位:秒)
a=recvonly/sendrecv/sendonly//收发模式
a=orient:<白板方向>//指明白板在屏莫上的方向
a=sdplang:<语言标记>//描述所有语言
a=lang:<语言标记>//会话描述的缺省语言或媒体描述的语言
媒体描述
13 m = <媒体>有5种类型:音频/视频/应用(如白板信息)/数据(不向用户显示的)/控制
<端口>媒体流发往传输层的端口。取决于c=行规定的网络类型和接下来的
<传送层协议:对UDP为1024-65535;对分层编码应用c = 行没有多播地址,要给出多播端口数, 如:m=video49170/2RTP/AVP31(表示:端口49170和49171为第一对RTP/RTCP端 口,49172和49173为第二对的端口)。<传送层协议>与c=行的地址类型有关。对 大多的媒体在RTP/UDP上传送,定义2种:RTP/AVP:IETFRTP协议,音/视频应用文 档。在UDP上传送。Udp:UDP协议。 <格式列表>:对音/视频,就是音/视频应用文档中规定媒体净荷类型。列表中都有可能用,但第 一个为缺省值,分为静态绑定和动态绑定:静态绑定即使媒体编码方式有净荷类型 号完全确定,动态绑定则媒体编码方式(如时钟频率,音频信道数等)没有完全 确定,需要进一步的属性说明。分别举例如下: Alaw的PCM编码单信道Audio,其净荷类型号为8,把它发往UDP端口 49232,则:m=audio49232RTP/AVP816bit线性编码,双声道立体声,抽样 速率16kHz,其动态净荷类型号98,则: m=audio49232RTP/AVP98a=rtpmap:98L16/16000/2
说明:
1. a=rtpmap:<净荷类型号><编码名>/<时钟速率>[/<编码参数>]对音频,编码参数为音频信道数;对视频没有定义
2. SDP允许rtpmap规定实验性编码格式,但编码名必须以X-起,表示此格式还没正式登记。
SDP用于构建INVITE和200OK响应消息的消息体,供主\被叫用户交换媒体信息。
SDP
在SIP电话中的应用
SDP用于构建INVITE和200OK响应消息的消息体,供主\被叫用户交换媒体信息。
1. 媒体流的配置
(1) 主被叫的媒体描述必须完全对应主被叫的第n个媒体流(“m=“)对应,都包含”a=rtpmap”.这样的目的是易于适应静态净荷类型到动态净荷类型的转换。
(2) 如被叫不想接收主叫提出的某个媒体流则在响应中设置该媒体流的端口号为0.并且必须返回对应的媒体流行。
2. 单播SDP值的设定
(1) 对于只发媒体流,端口号无意义,应设为0。
(2) 每个媒体流的净载荷类型例表应传送两个信息:能接受/发送的编译码,和用以标识这些编译码的RTP净载荷类型号。
(3) 如对于某一媒体流,主/被叫没有公共的媒体格式,被叫仍然要求返回媒体流的”m=“行,端口好为0,同时,不列净载荷类型。
(4) 如果所有媒体流均无公共的媒体格式,则被叫回送400响应(坏请求),并加入304警告头字段(无媒体类型)。
3. 多播操作
(1) 接受和发送的多播地址是相同的。
(2) 被叫不允许改变媒体流的只发,只收,或收/发特性。
(3) 如果被叫不支持多播,则回送400响应和330警告(多播不可用)。
4. 延时媒体流
由于主叫可能实际上是一个和其他协议(如H.323)互同的协议的网关,与S要求呼叫建立后进行媒体协商.这样,主叫可以先发不带SDP的INVITE,通过ACK或重新发一个INVITE请求修改被叫的会话描述(SDP)。
5. 媒体流保持
如果要求对方进入HOLD,即暂时停止发送一个或多个媒体流,这可以用Re-INVITE,话描述和原来的请求或响应中的描述相同,只是,”c=“为”0.0.0.0”,还有就是Re_INVITE中的Cseq得递增。
6. 对应于SIP中有3个实体字段
(1) Content-Type:指明消息体类型,有两种:i.Application/sdp:表示是SDP会话描述ii.Text/html。表示是普通文本或HTML格式的描述。
(2) Content-Encoding:补充说明消息体类型,使用户可以采用压缩编码编辑消息体。
(3) Content-Length:给出消息体的字节数。
3.1 SDP的举例描述
v=0(版本为0)
o=bell536557652353687637INIP4128.3.4.5(会话源:用户名bell,会话标
识53655765,版本2353687637,网络类型internet,地址类型Ipv4,地址128.3.4.5)
s=Mr.Watson,comehere.(会话名:Mr.Watson,comehere.)
i=ASeminaronthesessiondescriptionprotocol(会话信息:)
t=31493286000(起始时间:t=3149328600(NTP时间值),终止时间:无)
c=INIP4kton.bell-tel.com(连接数据:网络类型internet,地址类型Ipv4,连接地址kton.bell-tel.com)
m=audio3456RTP/AVP0345(媒体格式:媒体类型audio,端口号3456,传送层协议RTP/AVP,格式列表为0345)
a=rtpmap:0PCMU/8000(净荷类型0,编码名PCMU,抽样速度为8kHZ)
a=rtpmap:3GSM/8000(净荷类型3,编码名GSM,抽样速度为8kHZ)
a=rtpmap:4G723/8000(净荷类型4,编码名G723,抽样速度为8kHZ)
a=rtpmap:5DVI4/8000(净荷类型5,编码名DVI4,抽样速度为8kHZ)
Sip中sdp消息举例描述
下例是个典型正常的sip电话呼叫流程:
主叫IP:219.150.170.175被叫IP:219.150.170.177软交换IP:219.150.172.66
呼叫过程:主叫摘机拨号,被叫振铃,被叫摘机,通话,主叫挂机,被叫听忙音,被叫挂机。
1. 主叫摘机拨号
INVITEsip:5361201@219.150.172.66SIP/2.0
Via:SIP/2.0/UDP219.150.170.175:5060;branch=z9hG4bK56fb62b7
To:”5361201”<sip:5361201@219.150.172.66>
From:”5361203”<sip:5361203@219.150.172.66>;tag=afaa96db-30263
Call-ID:1b4659ea-afaa96db@219.150.170.175
CSeq:15688INVITE
Contact:<sip:5361203@219.150.170.175:5060>
Max-Forwards:70
User-Agent:ZTEMULTIMEDIASIPPHONE/V1.004-01-10
Content-Type:application/sdp//表示是SDP会话描述
Content-Length:266//消息体为266字节
v=0//版本为0
o=536120333395842673608019723INIP4219.150.170.175
//会话源:用户名5361203,会话标识3339584267,版本3608019723,网络类型internet,地址类型Ipv4,地址主叫ip219.150.170.175
s=sessionSDP//会话名:sessionSDP
c=INIP4219.150.170.175//连接数据:网络类型internet,地址类型Ipv4,连接地址219.150.170.175
t=00//无开始和结束时间
m=audio10000RTP/AVP048//媒体格式:媒体类型audio,端口号10000,传送层协议RTP/AVP,格式列表为048
a=ptime:20//媒体分组的时长20s
a=rtpmap:0PCMU/8000//净荷类型0,编码名PCMU,抽样速度为8kHZ
a=rtpmap:4G723/8000//净荷类型4,编码名G723,抽样速度为8kHZ
a=rtpmap:8PCMA/8000//净荷类型8,编码名PCMA,抽样速度为8kHZ
m=video10002RTP/AVP34//媒体格式:媒体类型video,端口号10002,传送层协议RTP/AVP,格式列表为34
a=rtpmap:34H263/90000//净荷类型34,编码名H263,抽样速度为90kHZ。
2. 软交换应答Trying
SIP/2.0100Trying
Via:SIP/2.0/UDP219.150.170.175:5060;branch=z9hG4bK56fb62b7
To:”5361201”<sip:5361201@219.150.172.66>
From:”5361203”<sip:5361203@219.150.172.66>;tag=afaa96db-30263
Call-ID:1b4659ea-afaa96db@219.150.170.175
CSeq:15688INVITE。
3. 软交换转发INVITE到被叫
INVITEsip:5361201@219.150.170.177SIP/2.0
Via:SIP/2.0/UDP219.150.172.66:5060;branch=751e6026.0
Via:SIP/2.0/UDP219.150.170.175:5060;branch=z9hG4bK56fb62b7
To:”5361201”<sip:5361201@219.150.172.66>
From:”5361203”<sip:5361203@219.150.172.66>;tag=afaa96db-30263
Call-ID:1b4659ea-afaa96db@219.150.170.175
CSeq:15688INVITE
Contact:<sip:5361203@219.150.170.175:5060>
Max-Forwards:69
Record-Route:<sip:219.150.172.66>
User-Agent:ZTEMULTIMEDIASIPPHONE/V1.004-01-10
Content-Type:application/sdp
Content-Length:266
v=0
o=536120333395842673608019723INIP4219.150.170.175
s=sessionSDP
c=INIP4219.150.170.175
t=00
m=audio10000RTP/AVP048
a=ptime:20
a=rtpmap:0PCMU/8000
a=rtpmap:4G723/8000
a=rtpmap:8PCMA/8000
m=video10002RTP/AVP34
a=rtpmap:34H263/90000。
4. 被叫应答Trying
SIP/2.0100Trying
Via:SIP/2.0/UDP219.150.172.66:5060;branch=751e6026.0
Via:SIP/2.0/UDP219.150.170.175:5060;branch=z9hG4bK56fb62b7
To:”5361201”<sip:5361201@219.150.172.66>
From:”5361203”<sip:5361203@219.150.172.66>;tag=afaa96db-30263
Call-ID:1b4659ea-afaa96db@219.150.170.175
CSeq:15688INVITE
Record-Route:<sip:219.150.172.66>
Content-Length:0。
5. 被叫应答Ringing
SIP/2.0180Ringing
Via:SIP/2.0/UDP219.150.172.66:5060;branch=751e6026.0
Via:SIP/2.0/UDP219.150.170.175:5060;branch=z9hG4bK56fb62b7
To:”5361201”<sip:5361201@219.150.172.66>;tag=jmNAzkktW56kiV0M1Y
From:”5361203”<sip:5361203@219.150.172.66>;tag=afaa96db-30263
Call-ID:1b4659ea-afaa96db@219.150.170.175
CSeq:15688INVITE
Record-Route:<sip:219.150.172.66>
Contact:<sip:5361201@219.150.170.177>
Content-Length:0。
6. 被叫应答OK
SIP/2.0200OK
Via:SIP/2.0/UDP219.150.172.66:5060;branch=751e6026.0
Via:SIP/2.0/UDP219.150.170.175:5060;branch=z9hG4bK56fb62b7
To:”5361201”<sip:5361201@219.150.172.66>;tag=jmNAzkktW56kiV0M1Y
From:”5361203”<sip:5361203@219.150.172.66>;tag=afaa96db-30263
Call-ID:1b4659ea-afaa96db@219.150.170.175
CSeq:15688INVITE
Record-Route:<sip:219.150.172.66>
Allow:INVITE,ACK,OPTIONS,BYE,CANCEL,MESSAGE,INFO,UPDATE
Contact:<sip:5361201@219.150.170.177>
Content-Type:application/sdp//表述SDP会话描述
Content-Length:218//消息长度字节数218
v=0//版本号
o=536120133395842683608019724INIP4219.150.172.66
//会话源:用户名5361201,会话标识3339584268,版本3608019724,网络类型internet,地址类型Ipv4,地址219.150.172.66
s=SDPSessionForC&SMoIP//会话名:SDPSessionForC&SMoIP
c=INIP4219.150.170.177//连接数据:网络类型internet,地址类型Ipv4,连接地址219.150.170.177
t=00//开始结束时间,无
m=audio40000RTP/AVP0//被叫匹配的媒体格式:媒体类型audio,端口号40000,传送层协议RTP/AVP,格式列表为0
a=rtpmap:0PCMU/8000//净荷类型0,编码名PCMU,抽样速度为8kHZ
m=video40002RTP/AVP34//媒体格式:媒体类型video,端口号40002,传送层协议RTP/AVP,格式列表为34
a=rtpmap:34H263/90000//净荷类型34,编码名H263,抽样速度为90kHZ。
7. 软交换转发Ringing
SIP/2.0180Ringing
Via:SIP/2.0/UDP219.150.170.175:5060;branch=z9hG4bK56fb62b7
To:”5361201”<sip:5361201@219.150.172.66>;tag=jmNAzkktW56kiV0M1Y
From:”5361203”<sip:5361203@219.150.172.66>;tag=afaa96db-30263
Call-ID:1b4659ea-afaa96db@219.150.170.175
CSeq:15688INVITE
Contact:<sip:5361201@219.150.170.177>
Record-Route:<sip:219.150.172.66>
Content-Length:0。
8. 软交换转发OK
SIP/2.0200OK
Via:SIP/2.0/UDP219.150.170.175:5060;branch=z9hG4bK56fb62b7
To:”5361201”<sip:5361201@219.150.172.66>;tag=jmNAzkktW56kiV0M1Y
From:”5361203”<sip:5361203@219.150.172.66>;tag=afaa96db-30263
Call-ID:1b4659ea-afaa96db@219.150.170.175
CSeq:15688INVITE
Contact:<sip:5361201@219.150.170.177>
Allow:INVITE,ACK,OPTIONS,BYE,CANCEL,MESSAGE,INFO,UPDATE
Record-Route:<sip:219.150.172.66>
Content-Type:application/sdp
Content-Length:218
v=0
o=536120133395842683608019724INIP4219.150.172.66
s=SDPSessionForC&SMoIP
c=INIP4219.150.170.177
t=00
m=audio40000RTP/AVP0
a=rtpmap:0PCMU/8000
m=video40002RTP/AVP34
a=rtpmap:34H263/90000。
9. 主叫发送ACK
ACKsip:219.150.172.66SIP/2.0
Via:SIP/2.0/UDP219.150.170.175:5060;branch=z9hG4bK56fb62b7
To:”5361201”<sip:5361201@219.150.172.66>;tag=jmNAzkktW56kiV0M1Y
From:”5361203”<sip:5361203@219.150.172.66>;tag=afaa96db-30263
Call-ID:1b4659ea-afaa96db@219.150.170.175
CSeq:15688ACK
Contact:<sip:5361203@219.150.170.175:5060>
Max-Forwards:70
Route:<sip:5361201@219.150.170.177>。
10. 软交换转发ACK
ACKsip:5361201@219.150.170.177SIP/2.0
Via:SIP/2.0/UDP219.150.172.66:5060;branch=4b781cbf.0
Via:SIP/2.0/UDP219.150.170.175:5060;branch=z9hG4bK56fb62b7
To:”5361201”<sip:5361201@219.150.172.66>;tag=jmNAzkktW56kiV0M1Y
From:”5361203”<sip:5361203@219.150.172.66>;tag=afaa96db-30263
Call-ID:1b4659ea-afaa96db@219.150.170.175
CSeq:15688ACK
Contact:<sip:5361203@219.150.170.175:5060>
Max-Forwards:69。
11. 主叫挂机
BYEsip:219.150.172.66SIP/2.0
Via:SIP/2.0/UDP219.150.170.175:5060;branch=z9hG4bK5b9377ab
To:”5361201”<sip:5361201@219.150.172.66>;tag=jmNAzkktW56kiV0M1Y
From:”5361203”<sip:5361203@219.150.172.66>;tag=afaa96db-30263
Call-ID:1b4659ea-afaa96db@219.150.170.175
CSeq:15689BYE
Max-Forwards:70
Route:<sip:5361201@219.150.170.177>
User-Agent:ZTEMULTIMEDIASIPPHONE/V1.004-01-10。
12. 软交换转发BYE
BYEsip:5361201@219.150.170.177SIP/2.0
Via:SIP/2.0/UDP219.150.172.66:5060;branch=03e255d5.0
Via:SIP/2.0/UDP219.150.170.175:5060;branch=z9hG4bK5b9377ab
To:”5361201”<sip:5361201@219.150.172.66>;tag=jmNAzkktW56kiV0M1Y
From:”5361203”<sip:5361203@219.150.172.66>;tag=afaa96db-30263
Call-ID:1b4659ea-afaa96db@219.150.170.175
CSeq:15689BYE
Max-Forwards:69
User-Agent:ZTEMULTIMEDIASIPPHONE/V1.004-01-10。
13. 被叫应答OK
SIP/2.0200OK
Via:SIP/2.0/UDP219.150.172.66:5060;branch=03e255d5.0
Via:SIP/2.0/UDP219.150.170.175:5060;branch=z9hG4bK5b9377ab
To:”5361201”<sip:5361201@219.150.172.66>;tag=jmNAzkktW56kiV0M1Y
From:”5361203”<sip:5361203@219.150.172.66>;tag=afaa96db-30263
Call-ID:1b4659ea-afaa96db@219.150.170.175
CSeq:15689BYE
Content-Length:0。
14. 软交换转发OK
SIP/2.0200OK
Via:SIP/2.0/UDP219.150.170.175:5060;branch=z9hG4bK5b9377ab
To:”5361201”<sip:5361201@219.150.172.66>;tag=jmNAzkktW56kiV0M1Y
From:”5361203”<sip:5361203@219.150.172.66>;tag=afaa96db-30263
Call-ID:1b4659ea-afaa96db@219.150.170.175
CSeq:15689BYE
Content-Length:0。