这个实例最简单的说法就是,利用 SIP 获取好友状态信息以及发送及时消息。我们经常用的 QQ 或MSN 就是这种方式。一方用户可以获取另一方用户状态信息。状态信息用来表示该用户目前的工作状态,例如:工作中、休息中等等。目前新版本的聊天工具还可以显示 个人消息的能力。
在 SIP 协议中,规定可以使用 SUBSCRIBE 来请求状态或者改写状态,用 NOTIFY 获得状态信息。在本例中,Chebychev 希望和 Possion 通信。为了能够知道 Possion 的状态情况,Chebychev 通过发送 SUBSCRIBE 订阅 Possion 状态信息,消息内容如下:
SUBSCRIBE sip:poisson@probability.org SIP/2.0
Via SIP/2.0/TCP lecturehall21.academy.ru:5060;branch=z9hG4bK348471123
Max-Forwards: 70
To: M. Poisson <sip:poisson@probability.org>
From: P. L. Chebychev <sip:chebychev@academy.ru>;tag=21171
Call-ID: 58dkfj34924lk34452k592520
CSeq: 3412 SUBSCRIBE
Allow-Events: presence
Allow: ACK, INVITE, CANCEL, BYE, NOTIFY, SUBSCRIBE, MESSAGE
Contact: <sip:pafnuty@lecturehall21.academy.ru;transport=tcp>
Event: presence
Content-Length: 0
Poisson 接收到 SUBSCRIBE 消息后,发送 202 Accepted 响应返回到 Chebychev
SIP/2.0 202 Accepted
Via SIP/2.0/TCP lecturehall21.academy.ru:5060
;branch=z9hG4bK348471123;received=19.34.3.1
To: M. Poisson <sip:poisson@probability.org>;tag=25140
From: P. L. Chebychev <sip:chebychev@academy.ru>;tag=21171
Call-ID: 58dkfj34924lk34452k592520
CSeq: 3412 SUBSCRIBE
Allow-Events: presence
Allow: ACK, INVITE, CANCEL, BYE, NOTIFY, SUBSCRIBE, MESSAGE
Contact: <sip:s.possion@dist.probability.org;transport=tcp>
Event: presence
Expires: 3600
Content-Length: 0
之后,Possion 向 Chebychev 发送 NOTIFY消息,表示其当前状态
NOTIFY sip:pafnuty@lecturehall21.academy.ru SIP/2.0
Via SIP/2.0/TCP dist.probablilty.org:5060;branch=z9hG4bK4321
Max-Forwards: 70
To: P. L. Chebychev <sip:chebychev@academy.ru>;tag=21171
From: M. Poisson <sip:poisson@probability.org>;tag=25140
Call-ID: 58dkfj34924lk34452k592520
CSeq: 1026 NOTIFY
Allow: ACK, INVITE, CANCEL, BYE, NOTIFY, SUBSCRIBE, MESSAGE
Allow-Events: dialog
Contact: <sip:s.possion@dist.probability.org;transport=tcp>
Subscription-State: active;expires=3600
Event: presence
Content-Type: application/cpim-pidf+xml
Content-Length: 244
<?xml version="1.0" encoding="UTF-8"?>
<presence xmlns="urn:ietf:params:xml:ns:cpim-pidf"
entity="sip:poisson@probability.org">
<tuple id="452426775">
<status>
<basic>closed</basic>
</status>
</tuple>
</presence>
Chebychev 发送 200 OK 响应 NOTIFY
SIP/2.0 200 OK
Via SIP/2.0/TCP dist.probablilty.org:5060
;branch=z9hG4bK4321;received=24.32.1.3
To: P. L. Chebychev <sip:chebychev@academy.ru>;tag=21171
From: M. Poisson <sip:poisson@probability.org>;tag=25140
Call-ID: 58dkfj34924lk34452k592520
CSeq: 1026 NOTIFY
Content-Length: 0
之后,当 Poisson 登陆后,再次发送 NOTIFY 消息
NOTIFY sip:pafnuty@lecturehall21.academy.ru SIP/2.0
Via SIP/2.0/TCP dist.probablilty.org:5060;branch=z9hG4bK334241
Max-Forwards: 70
To: P. L. Chebychev <sip:chebychev@academy.ru>;tag=21171
From: M. Poisson <sip:poisson@probability.org>;tag=25140
Call-ID: 58dkfj34924lk34452k592520
CSeq: 1027 NOTIFY
Allow: ACK, INVITE, CANCEL, BYE, NOTIFY, SUBSCRIBE, MESSAGE
Allow-Events: presence
Contact: <sip:s.possion@dist.probability.org;transport=tcp>
Subscription-State: active;expires=1800
Event: presence
Content-Type: application/cpim-pidf+xml
Content-Length: 325
<?xml version="1.0" encoding="UTF-8"?>
<presence xmlns="urn:ietf:params:xml:ns:cpim-pidf"
entity="sip:poisson@probability.org">
<tuple id="452426775">
<status>
<basic>open</basic>
</status>
<contact>sip:s.possion@dist.probability.org;transport=tcp
</contact>
</tuple>
</presence>
Chebychev 发 200 OK 确认
SIP/2.0 200 OK
Via SIP/2.0/TCP dist.probablilty.org:5060
;branch=z9hG4bK334241;received=24.32.1.3
To: P. L. Chebychev <sip:chebychev@academy.ru>;tag=21171
From: M. Poisson <sip:poisson@probability.org>;tag=25140
Call-ID: 58dkfj34924lk34452k592520
CSeq: 1027 NOTIFY
Content-Length: 0
现在 Chebychev 已经知道 Possion 在线了,开始发送及时消息。
MESSAGE sip:s.possion@dist.probability.org SIP/2.0
Via SIP/2.0/TCP lecturehall21.academy.ru:5060;branch=z9hG4bK3gtr2
Max-Forwards: 70
To: M. Poisson <sip:s.possion@dist.probability.org>
From: P. L. Chebychev <sip:chebychev@academy.ru>;tag=4542
Call-ID: 9dkei93vjq1ei3
CSeq: 15 MESSAGE
Allow: ACK, INVITE, CANCEL, BYE, NOTIFY, SUBSCRIBE, MESSAGE
Content-Type: text/plain
Content-Length: 9
Hi There!
注意到这里,MESSAGE 是独立与会话的,它不属于任何会话。每个消息都含有一个新的 Call-ID 和 From tag。200 OK 用来确认收到该信息。
SIP/2.0 200 OK
Via SIP/2.0/TCP lecturehall21.academy.ru:5060;branch=z9hG4bK3gtr2;received=19.34.3.1
To: M. Poisson <sip:s.possion@dist.probability.org>;tag=2321
From: P. L. Chebychev <sip:chebychev@academy.ru>;tag=4542
Call-ID: 9dkei93vjq1ei3
CSeq: 15 MESSAGE
Content-Length: 0
Possion 开始回复消息
MESSAGE sip:chebychev@academy.ru SIP/2.0
Via SIP/2.0/TCP dist.probablilty.org:5060;branch=z9hG4bK4526245
Max-Forwards: 70
To: P. L. Chebychev <sip:chebychev@academy.ru>
From: M. Poisson <sip:s.possion@dist.probability.org>;tag=14083
Call-ID: lk34452k592520
CSeq: 2321 MESSAGE
Allow: ACK, INVITE, CANCEL, BYE, NOTIFY, SUBSCRIBE, MESSAGE
Content-Type: text/plain
Content-Length: 30
Well, hello there to you, too!
收到消息后,发 200 OK
SIP/2.0 200 OK
Via SIP/2.0/TCP dist.probablilty.org:5060;branch=z9hG4bK4526245;received=24.32.1.3
To: P. L. Chebychev <sip:chebychev@academy.ru>;tag=mc3bg5q77wms
From: M. Poisson <sip:s.possion@dist.probability.org>;tag=14083
Call-ID: lk34452k592520
CSeq: 2321 MESSAGE
Content-Length: 0
(cr0_3) |