| 统计 |
blog名称:人在旅途 日志总数:175 评论数量:505 留言数量:13 访问次数:1676900 建立时间:2005年12月7日 |
生命是过客,人在旅途。奶奶是信基督教的,没啥文化,却养育了四子二女,还带过九个孙辈。老人家对生命的看法就是“人都是客人,迟早要回去的。”就以《人在旅途》来纪念她。

| « | October 2025 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | |
|
| 公告 |
本人上传的源程序中可能引用或使用了第三方的库或程序,也可能是修改了第三方的例程甚至是源程序.所以本人上传的源程序禁止在以单纯学习为目的的任何以外场合使用,不然如果引起任何版权问题,本人不负任何责任. | |

|
本站首页 管理页面 写新日志 退出
调整中...
[SIP技术]<<A JAIN-SIP Applet Phone>>学习笔记 |
人在旅途 发表于 2006/3/2 10:10:53 | 这个程序和InstantMessaging不同,它可以用来观察IP电话从拨打(invite)到挂机(bye)的一系列SIP消息.
1.安装
从http://snad.ncsl.nist.gov/proj/iptel/下载该软件(含原程序)和JAIN-SIP库.
从SUN网站下载并安装JMF,JavaMail,JAF.
2.用NetBeans5.0编译和运行(Windows环境)
编辑build.windows.properties,设置其中java.home,jmf.home,tomcat.home,mail.home,jaf.home到合适值.
编辑build.xml,设置第二行为<property file="build.windows.properties"/>.
启动NetBeans5.0,使用AntScript形式打开本项目,运行build中的all项目,再运行build中的messenger项目,可看见<NIST Message>画面出现.
3.和NIST-SIP Proxy连接
启动<NIST-SIP Proxy>.
打开<NIST Message>的Configuration画面,在URI中输入<NIST-SIP Proxy>中存在的用户ID(格式:XXX@XXX2.XXX3).在ProxyAddress和ProxyPort中输入<NIST-SIP Proxy>的地址信息.执行Register菜单命令.执行AddContact按钮命令,输入<NIST-SIP Proxy>中存在的另一用户ID(格式:XXX@XXX2.XXX3).
4.实时音频呼叫时的SIP消息分析
准备:
启动一个<NIST-SIP Proxy>,地址192.168.1.2:4000;
启动两个<NIST Message>,dog@192.168.1.2:3250和cat@192.168.1.3:9385;在configuration中设为Realtime选项并设置PROXY参数为192.168.1.2:4000.
在dog的通讯录中双击cat打开对话框,单击Audio按钮,cat会弹出确认框,单打ACCEPT按钮接受邀请.
一段时间后在henrik处的对话框中单击STOP按钮关闭这次通话.
以下分析<NIST-SIP Proxy>的LOG和两个<NIST Message>的LOG,<NIST Message>的LOG可从NetBeans的TraceWindowCOPY来.
From
To
Command
Message
说明
dog
Proxy
INVITE
INVITE sip:cat@nist.gov;transport=udp SIP/2.0Call-ID: 3a82d615f5028ce47d53e40c363e48c9@192.168.1.2CSeq: 1 INVITEFrom: <sip:dog@nist.gov>;tag=9242To: <sip:cat@nist.gov>Via: SIP/2.0/UDP 192.168.1.2:3250;branch=z9hG4bKe40eac54e444c4faec30b0df09ddd55cMax-Forwards: 2Contact: <sip:dog@192.168.1.2:3250;transport=udp>Content-Type: application/sdpContent-Length: 109
v=0o=dog 878212 879581 IN IP4 192.168.1.2s=-c=IN IP4 192.168.1.2t=0 0m=audio 8376 RTP/AVP 5 4 3 0
Content中给出了dog的音频通道信息
Proxy
dog
Trying
SIP/2.0 100 TryingCall-ID: 3a82d615f5028ce47d53e40c363e48c9@192.168.1.2CSeq: 1 INVITEFrom: <sip:dog@nist.gov>;tag=9242To: <sip:cat@nist.gov>Via: SIP/2.0/UDP 192.168.1.2:3250;branch=z9hG4bKe40eac54e444c4faec30b0df09ddd55cMax-Forwards: 2Content-Length: 0
Proxy
cat
INVITE sip:cat@192.168.1.3:9385 SIP/2.0Call-ID: 3a82d615f5028ce47d53e40c363e48c9@192.168.1.2CSeq: 1 INVITEFrom: <sip:dog@nist.gov>;tag=9242To: <sip:cat@nist.gov>Via: SIP/2.0/UDP 192.168.1.2:4000;branch=z9hG4bK83376d784f617e7d1326103a2cf0a9b4,SIP/2.0/UDP 192.168.1.2:3250;branch=z9hG4bKe40eac54e444c4faec30b0df09ddd55cMax-Forwards: 1Contact: <sip:dog@192.168.1.2:3250;transport=udp>Content-Type: application/sdpRecord-Route: <sip:192.168.1.2:4000>Content-Length: 109
Proxy向cat转送上一消息
cat
Proxy
Ringing
Response 180 Ringing received:SIP/2.0 180 RingingCall-ID: 3a82d615f5028ce47d53e40c363e48c9@192.168.1.2CSeq: 1 INVITEFrom: <sip:dog@nist.gov>;tag=9242To: <sip:cat@nist.gov>Via: SIP/2.0/UDP 192.168.1.2:4000;branch=z9hG4bKc202584ca6e6447cf37713092e2d109b,SIP/2.0/UDP 192.168.1.2:3250;branch=z9hG4bKe40eac54e444c4faec30b0df09ddd55cMax-Forwards: 1Record-Route: <sip:192.168.1.2:4000>Content-Length: 0
此时cat处弹出接受确认框.
Proxy
dog
SIP/2.0 180 RingingCall-ID: 3a82d615f5028ce47d53e40c363e48c9@192.168.1.2CSeq: 1 INVITEFrom: <sip:dog@nist.gov>;tag=9242To: <sip:cat@nist.gov>Via: SIP/2.0/UDP 192.168.1.2:3250;branch=z9hG4bKe40eac54e444c4faec30b0df09ddd55cMax-Forwards: 1Record-Route: <sip:192.168.1.2:4000>Content-Length: 0
Proxy向dog转送上一消息
cat
Proxy
OK
SIP/2.0 200 OKCall-ID: 3a82d615f5028ce47d53e40c363e48c9@192.168.1.2CSeq: 1 INVITEFrom: <sip:dog@nist.gov>;tag=9242To: <sip:cat@nist.gov>;tag=2312Via: SIP/2.0/UDP 192.168.1.2:4000;branch=z9hG4bKc202584ca6e6447cf37713092e2d109b,SIP/2.0/UDP 192.168.1.2:3250;branch=z9hG4bKe40eac54e444c4faec30b0df09ddd55cMax-Forwards: 1Record-Route: <sip:192.168.1.2:4000>Contact: <sip:cat@192.168.1.3:9385;transport=udp>Content-Type: application/sdpContent-Length: 99
v=0o=cat 7787 9156 IN IP4 192.168.1.3s=-c=IN IP4 192.168.1.3t=0 0m=audio 2262 RTP/AVP 5
cat的接受确认框被确认(按OK按钮).
注意Content的内容和dog的Invite消息已经不同,已经是cat的音频通道信息了.
Proxy向dog转送上一消息
dog
Proxy
ACK
ACK sip:192.168.1.2:4000;transport=udp SIP/2.0Call-ID: 3a82d615f5028ce47d53e40c363e48c9@192.168.1.2CSeq: 1 ACKFrom: <sip:dog@nist.gov>;tag=9242To: <sip:cat@nist.gov>;tag=2312Via: SIP/2.0/UDP 192.168.1.2:3250;branch=-2015693566Max-Forwards: 2Route: <sip:cat@192.168.1.3:9385;transport=udp>Content-Length: 0
Proxy向cat转送上一消息
dog侧
Get chat session: cat@nist.govcallee cat@nist.gov:chatFrame gov.nist.applet.phone.ua.gui.ChatFrame[frame0,229,163,750x430,invalid,layout=java.awt.BorderLayout,title=In conversation with cat@nist.gov,resizable,normal,defaultCloseOperation=DISPOSE_ON_CLOSE,rootPane=javax.swing.JRootPane[,4,30,742x396,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]:status Ringing...Local listening audio port : 8376Remote listening audio port : 2262Init UDP TransmitterThreshold enabled : truebuf length : 0minimum Threshold : 2147483647 - Waiting for RTP data to arrive... - Open RTP session for: Address: 192.168.1.3 localPort: 8376 destPort : 2262 Time To Live: 1- number of capture devices: 2Track 0 is set to transmit as: dvi/rtp, 22050.0 Hz, 4-bit, MonoCreated RTP session: 192.168.1.3 dest 2262Media Transmission started!!!Get chat session: cat@nist.govcallee cat@nist.gov:chatFrame gov.nist.applet.phone.ua.gui.ChatFrame[frame0,229,163,750x430,invalid,layout=java.awt.BorderLayout,title=In conversation with cat@nist.gov,resizable,normal,defaultCloseOperation=DISPOSE_ON_CLOSE,rootPane=javax.swing.JRootPane[,4,30,742x396,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]:status In a call - Received new RTP stream: dvi/rtp, 22050.0 Hz, 4-bit, Mono The sender of this stream had yet to be identified.1format list : 1mpegControl::::null - A new participant had just joined: zhou@hp9010mpegControl::::nullmpegControl::::nullmpegControl::::nullmpegControl::::nullClass for gain contolcom.sun.media.renderer.audio.DirectAudioRenderer$MCA@6db33cClass for componentnull - A new participant had just joined: zhou@hp9010 - The previously unidentified stream dvi/rtp, 22050.0 Hz, 4-bit, Mono had now been identified as sent by: zhou@hp9010
dog和cat进行直接RTP通信,不经过Proxy
cat侧
- Waiting for RTP data to arrive...from="192.168.1.2:4000" to="192.168.1.3:9385" time="1141344698968" isSender="false" transactionId="z9hg4bk97119ae84b4364caad83f7759147d4a5" callId="3a82d615f5028ce47d53e40c363e48c9@192.168.1.2" firstLine="ACK sip:cat@192.168.1.3:9385 SIP/2.0" - Received new RTP stream: dvi/rtp, 22050.0 Hz, 4-bit, Mono The sender of this stream had yet to be identified.debugLine="0" ><![CDATA[ACK sip:cat@192.168.1.3:9385 SIP/2.0Call-ID: 3a82d615f5028ce47d53e40c363e48c9@192.168.1.2CSeq: 1 ACKFrom: <sip:dog@nist.gov>;tag=9242To: <sip:cat@nist.gov>;tag=2312Via: SIP/2.0/UDP 192.168.1.2:4000;branch=z9hG4bK97119ae84b4364caad83f7759147d4a5,SIP/2.0/UDP 192.168.1.2:3250;branch=-2015693566Max-Forwards: 1Record-Route: <sip:192.168.1.2:4000>Content-Length: 0
]]></message>
Init UDP TransmitterThreshold enabled : truebuf length : 0minimum Threshold : 2147483647 - Open RTP session for: Address: 192.168.1.2 localPort: 2262 destPort : 8376 Time To Live: 1- number of capture devices: 21format list : 1mpegControl::::nullTrack 0 is set to transmit as: dvi/rtp, 22050.0 Hz, 4-bit, MonoCreated RTP session: 192.168.1.2 dest 8376mpegControl::::nullmpegControl::::nullmpegControl::::nullmpegControl::::nullClass for gain contolcom.sun.media.renderer.audio.DirectAudioRenderer$MCA@22ab57Class for componentnullMedia Transmission started!!!Get chat session: dog@nist.govcallee dog@nist.gov:chatFrame gov.nist.applet.phone.ua.gui.ChatFrame[frame0,0,0,750x430,invalid,layout=java.awt.BorderLayout,title=In conversation with dog@nist.gov,resizable,normal,defaultCloseOperation=DISPOSE_ON_CLOSE,rootPane=javax.swing.JRootPane[,4,30,742x396,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]:status In a call - A new participant had just joined: zhou@desktop - A new participant had just joined: zhou@desktop - The previously unidentified stream dvi/rtp, 22050.0 Hz, 4-bit, Mono had now been identified as sent by: zhou@desktop
dog和cat进行直接RTP通信,不经过Proxy.
dog
Proxy
BYE
BYE sip:192.168.1.2:4000;transport=udp SIP/2.0Call-ID: 3a82d615f5028ce47d53e40c363e48c9@192.168.1.2CSeq: 2 BYEFrom: <sip:dog@nist.gov>;tag=9242To: <sip:cat@nist.gov>;tag=2312Via: SIP/2.0/UDP 192.168.1.2:3250;branch=z9hG4bKe553a3a2689bc91df1ec554e21f51309Max-Forwards: 2Route: <sip:cat@192.168.1.3:9385;transport=udp>Content-Length: 0
dog册按下STOP按钮.消息发出后RTP读写终止.
Proxy向cat转送上一消息
cat
Proxy
OK
SIP/2.0 200 OKCall-ID: 3a82d615f5028ce47d53e40c363e48c9@192.168.1.2CSeq: 2 BYEFrom: <sip:dog@nist.gov>;tag=9242To: <sip:cat@nist.gov>;tag=2312Via: SIP/2.0/UDP 192.168.1.2:4000;branch=z9hG4bK26c72e5e7e444f3482fcce6ae0cc9451,SIP/2.0/UDP 192.168.1.2:3250;branch=z9hG4bKe553a3a2689bc91df1ec554e21f51309Max-Forwards: 2Content-Length: 0
消息发出后RTP读写终止.
Proxy向dog转送上一消息
如果两边的<NIST Message>的Configuration设置中都使用了MessageAudio(非RealtimeAudio),那么上面表格中的RTP通信部分要给下面样子的带有音频数据的SIP消息替,这种SIP消息还是要走SIPProxy的(因为是用SIP消息来传送音频数据,所以即使在同一台机器上开两个<NIST Message>互相通信,仍然没有问题.).
************************************************************************************************
Request MESSAGE received:MESSAGE sip:192.168.1.2:4000;transport=udp SIP/2.0Call-ID: 34fd5cabb7b241ab16a8dfd3ea72bd30@192.168.1.26CSeq: 4 MESSAGEFrom: <sip:dog@nist.gov>;tag=832To: <sip:cat@nist.gov>;tag=8664Via: SIP/2.0/UDP 192.168.1.2:3250;branch=z9hG4bKc5f13997a614055784d833a491b18038Max-Forwards: 2Route: <sip:cat@192.168.1.3:9385;transport=udp>Content-Type: audio/x-gsmContact: <sip:dog@192.168.1.2:3250;transport=udp>Content-Length: 6435
?jT?P ??m??@6?m???@6?m??? 6?m??И?%??@6?m?? 6?m??d 6?m??? 6?m?????Y?@6?m?? 6?m??@6?m??? 6?m???raZ?`6?m??@6?m??? 6?m??@6?m???Wr]?r 6?m???@6?m??@6?m?? 6?m???z?Z?`6?m?? 6?m??|`6?m??? 6?m???r\?@6?m......................................
************************************************************************************************
如果cat拒绝了dog的邀请,则如下:
From
To
Command
Message
说明
dog
Proxy
INVITE
INVITE sip:cat@nist.gov;transport=udp SIP/2.0Call-ID: 1cf141e7e76a90905602764164de10da@192.168.1.2CSeq: 1 INVITEFrom: <sip:dog@nist.gov>;tag=8040To: <sip:cat@nist.gov>Via: SIP/2.0/UDP 192.168.1.2:9266;branch=z9hG4bK47cce90fb03443d2767efcf77d4e2b80Max-Forwards: 2Contact: <sip:dog@192.168.1.2:9266;transport=udp>Content-Type: application/sdpContent-Length: 109
v=0o=dog 940810 942179 IN IP4 192.168.1.2s=-c=IN IP4 192.168.1.2t=0 0m=audio 6836 RTP/AVP 5 4 3 0
Content中给出了dog的音频通道信息
Proxy
dog
Trying
SIP/2.0 100 TryingCall-ID: 1cf141e7e76a90905602764164de10da@192.168.1.2CSeq: 1 INVITEFrom: <sip:dog@nist.gov>;tag=8040To: <sip:cat@nist.gov>Via: SIP/2.0/UDP 192.168.1.2:9266;branch=z9hG4bK47cce90fb03443d2767efcf77d4e2b80Max-Forwards: 2Content-Length: 0
Proxy
cat
Proxy向cat转送上一消息
cat
Proxy
Ringing
SIP/2.0 180 RingingCall-ID: 1cf141e7e76a90905602764164de10da@192.168.1.2CSeq: 1 INVITEFrom: <sip:dog@nist.gov>;tag=8040To: <sip:cat@nist.gov>Via: SIP/2.0/UDP 192.168.1.2:4000;branch=z9hG4bK0437f73dd530f56022856f57cc55c49e,SIP/2.0/UDP 192.168.1.2:9266;branch=z9hG4bK47cce90fb03443d2767efcf77d4e2b80Max-Forwards: 1Record-Route: <sip:192.168.1.2:4000>Content-Length: 0
此时cat处弹出接受确认框.
Proxy
dog
Proxy向dog转送上一消息
cat
Proxy
Busy
SIP/2.0 486 Busy hereCall-ID: 1cf141e7e76a90905602764164de10da@192.168.1.2CSeq: 1 INVITEFrom: <sip:dog@nist.gov>;tag=8040To: <sip:cat@nist.gov>Via: SIP/2.0/UDP 192.168.1.2:4000;branch=z9hG4bK0437f73dd530f56022856f57cc55c49e,SIP/2.0/UDP 192.168.1.2:9266;branch=z9hG4bK47cce90fb03443d2767efcf77d4e2b80Max-Forwards: 1Record-Route: <sip:192.168.1.2:4000>Call-Info: <http://www.google.com>Content-Length: 0
cat的确认框被拒绝(按Cancel按钮).
Proxy向dog转送上一消息
|
阅读全文(35019) | 回复(16) | 编辑 | 精华 |
| 回复:<<A JAIN-SIP Applet Phone>>学习笔记 |
|
xhl(游客)发表评论于2006/11/3 11:37:15 |
搂主您好!
我已经看您贴的内容不下20遍了,无奈怎么也不懂。我是转行的新手,想用sip实现通话。看了jain sip可是怎么也不能上手,眼看就要毕业了,可是什么都不会。急死了,我真怀疑我是不是太弱了什么都学不会。能否告我要学点啥,才会编程呢?我已经看了sip原理,jain sip协议栈代码。不知还缺什么,求求您指点一下吧。我都快跳楼了。谢谢!!
以下为blog主人的回复:
你不用太担心,我也是做了一年半通信工程才转行做软件的.做软件不要什么东西的,唯一要的是你的兴趣,慢慢来积累经验,一切很容易会变好的.
不过做软件也是没出息的,到了年龄就没人要了(如同鸡一样),当然升到主管就不同了,不过十个没一个.也可以自己开公司,不过在中国什么都要靠关系,编程序的人还是不要去白白送死.建议你去搞营销,前(钱)程都似锦.
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
| 回复:<<A JAIN-SIP Applet Phone>>学习笔记 |
|
HEHE(游客)发表评论于2006/5/24 9:55:45 |
多谢楼主,选了"REAL TIME"以后就好了!
不过,一直都没有完整的INVITE-BYE流,似乎总是认证不通过,苦恼ing........!
以下为blog主人的回复:
把SERVER设置成不要认证(PASSWORD)不就可以了吗.
|
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
| 回复:<<A JAIN-SIP Applet Phone>>学习笔记 |
|
HEHE(游客)发表评论于2006/5/22 23:17:38 |
还有,抓包发现,使用的传输层协议是TCP,似乎应该是UDP才对,因为我朋友调试的OSIP电话,使用的就是UDP,并且没有出现(remove all bindings)这种东西.
更郁闷的是,我抓到的SIP数据包里居然没有contact这一项......
faint....! 不知道楼主研究的时候有没有这种情况啊?!?!
多谢!
以下为blog主人的回复:
在Configuration会话框中选择"Real Time"就是UDP了,如果选择了"Voice Messaging"可能就是TCP了.一般选择"Real Time",这样可以观察完整的打电话的INVITE-BYE的消息流,"Voice Messaging"用在MSNMESSAGE上面的.
|
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
| 回复:<<A JAIN-SIP Applet Phone>>学习笔记 |
|
HEHE(游客)发表评论于2006/5/22 22:18:21 |
请问一下,我最近也在搞JAIN-SIP APPLET PHONE,但是总也打不通,用了您介绍的抓包工具以后,发现以下情况:
Request:REGISTER sip:172.20.1.25:5060(remove all bindings)出现了红色的这句话,不知道什么意思.
还有,在认证OK的那个数据包里,有这么一句:
Status:200 OK(0 bindings)不知道这是什么意思?
而且不能再往下继续了,没有继续发INVITE!!!
请楼主帮看看是怎么回事!??
多谢!
以下为blog主人的回复:
Unregister和Register用的是同一个消息,只是expires为0,你是不是Unregister?
打不同先看看有没有完整的INVITE-BYE流.
|
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
| 回复:<<A JAIN-SIP Applet Phone>>学习笔记 |
|
RYAN(游客)发表评论于2006/5/5 11:59:14 |
不知道为什么我编译出来的JAIN-SIP Applet Phone无法使用SDP,可以成功注册,但不能通话,抓包分析发现,SDP无法使用!
请流浪狗大大帮忙看看是什么问题!
多谢
以下为blog主人的回复:
也许是JMS的错,换台机器试验下,我的是可以的,要么换成MjSIP试试.
JMS不太好,我有时也没声音,有时第一次好的,第二次通话就不好了.
|
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
| 和JAIN-SIP-PRESENCE-PROXY的连接 |
人在旅途发表评论于2006/3/10 15:18:29 | 1.如果要和JAIN-SIP-PRESENCE-PROXY连接,会发现unregister后画面没有变化仍然是register中状态.这可以通过改变MessageProcessor.processRegisterOK(..)来改正.
从:
if (expires != null && expires.getExpires() == 0){
改为:
if ((expires != null && expires.getExpires() == 0)||(registerOK.getHeader(ContactHeader.NAME)==null)){
2.关闭画面后,系统中仍然残留进程,经调查这是NISTMessenger.initComponents()和画面显示时有错,具体错误不详,不过和SIP和RTP没有关系,可在DOS中启动该JAVA程序,关闭画面后再关闭DOS画面即可杀掉该程序进程.
3.测试了下,速度较慢,INVITE对话要0.5秒,RTP流建立的时间更是要5-15妙.
|
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
|