| 统计 |
blog名称:人在旅途 日志总数:175 评论数量:505 留言数量:13 访问次数:1676728 建立时间: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技术]mjSip学习笔记 |
人在旅途 发表于 2006/3/13 15:38:48 |
1.URL:http://www.mjsip.org/
2.它也是用JAVA编写的,唯一要求的外部库是客户端使用的JMF(只要安装了JMF就可以了,编译和执行都不用特殊处理).它比SUN的JAIN的STACK简单,而且新,上次RELEASE估计在2005年十月份,所对应的SIP功能也比JAIN多,包括支持REFER等消息格式.它也提供源程序,源程序结构比JAIN简单多了,三个部分:包括SIP的STACK和SIP的SERVER和SIP的客户端.它也有BIN的下载,服务器和客户端配置都很简单,基本上看着配置文件内部说明就可以了.从我看到该网站到学习下栽编译测试和分析LOG基本上不用一天工作时间就完成了.
3.不过它的MAKE文件是GNU的不是ANT的,对NETBEANS来说使用不便,不过由于它结构简单,我很方便的用NETBEANS5.0生成了三个PRJ(STACK,SERVER,UA),再从源程序中拷贝JAVA文件和配置文件到这三个PRJ中,很方便地就再编译和执行成功了.
这三个NETBEANS5.0的PRJ源程序和项目文件在这里:500)this.width=500'>MjSIP.rar(只用于学习,版权问题盖不负责,请去http://www.mjsip.org/查询).
4.它的SERVER缺省运行在STATELESS中,当然也可是STATEFUL的.
5.和JAIN的SAMPLE一样,大概是JMF的缘故它的UA在通话中也有很大的延迟,大约一秒多吧.
6.可惜没有商业开发的免费许可(要购买).
7.测试了下,一次INITE对话大概要用0.2秒多点时间,其他简单的TRANSACTION只要用0.1妙左右.
8.2006年4月13日,发现各致命的错误:
当INVITE或REGISTER等消息因为认证(407,401)而被打回后,再加入了认证HEADER
再送时,消息的BRANCH值仍然和第一次的一样.这样一来就和第一次同一个TRANSACTION了(尽管程序是NEW了个新TRANSACTION,但它是用上次消息经过加工后NEW的,所以BRANCH值仍然是上次旧的),而RFC要求是两个不同的TRANSACTION,这样一来服务器就可能因为新消息仍然属于旧TRANSACTION而拒绝响应.
我在ExtendedInviteDialog.onTransFailureResponse中把旧消息的BRANCH值更新了下(在BaseMessage.refreshBranch()中增加了更新函数),测试了下INVITE或REGISTER的情况,正常.
|
阅读全文(70749) | 回复(52) | 编辑 | 精华 |
| 回复:mjSip学习笔记 |
|
feige(游客)发表评论于2006/3/29 18:49:08 |
我根据您说的修改了配置文件,但如果用
audio_codec=PCMU
就还是没有声音,
但如果是
audio_codec=GSM
打电话的一方的耳机中有吱吱的声音,但对方那边还是没有声音,
我再看看,非常感谢您的帮助!
我的主要配置信息如下:
#via_addr=192.168.68.13#host_port=4000transport_protocols=udp tcpoutbound_proxy=192.168.68.16:5060
from_url="2224" <sip:2224@192.168.68.16>username=2224realm=192.168.68.16passwd=debug_level=8log_path=logmax_logsize=2000
contacts_file=config/contacts.lst
keepalive_time=8000
audio=yesaudio_port=4002#audio_avp=0#audio_codec=PCMUaudio_codec=GSMaudio_sample_rate=8000 audio_sample_size=1audio_frame_size=500
use_jmf=yes
没列出来的都注释掉啦
以下为blog主人的回复:
建议除audio=yes以外的audio项全都comment掉,让程序自己去选择SDP参数.你的问题也许是两个UA之间不能建立相同SDP参数选择,可以用两台一个牌子的PC试一下(我就是这样的,问题就不大).
|
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
| 回复:mjSip学习笔记 |
|
fchenscut(游客)发表评论于2006/3/29 17:15:36 | 1.您是在实验室里面使用保留地址192.168.*.13与192.168.*.16 进行通讯,是吗?
2.在局域网内是不用使用诸如注册(REGISTRATION)和重定向(REDIRECTION)的,你的配置文件里面的一行:
#do_register=yes,前面的“#”符号已经删除了,是吗?
我昨天是在同一台电脑上测试,通过了。你也先在同一台电脑上测试吧!
今天,我连接了同一局域网上面的两台电脑,测试通过了,接收方听到的音乐像是从其本机播放出来的一样清晰!!!
我的配置是这样的:
# MjSip UA configuration file# ___________________________________________#
#via_addr=127.0.0.8host_port=5080transport_protocols=udp tcp#outbound_proxy=211.66.17.147:5060
from_url="Bob" <sip:bob@211.66.17.147>username=bobrealm=211.66.17.147#passwd=pippo
debug_level=8log_path=logmax_logsize=2000
contacts_file=config/contacts.lst
#do_register=yes#do_unregister=yes#do_unregister_all=yes
keepalive_time=8000
#call_to=sip:127.0.0.9:5090 #accept_time=0#hangup_time=20#redirect_to=sip:127.0.0.9:5090#no_offer=yes#transfer_to=sip:127.0.0.9:5090#transfer_time=10#re_invite_time=5
#recv_only=yes#send_only=yes#send_tone=yes#send_file=yes
audio=yesaudio_port=4002audio_avp=0audio_codec=PCMUaudio_sample_rate=8000 audio_sample_size=1audio_frame_size=500
#video=yes#video_port=4002#video_avp=101
use_jmf=yes#use_rat=yes#use_vic=yes#bin_rat="c:\program files\mbone\rat"#bin_vic="c:\program files\mbone\vic"#bin_rat=rat#bin_vic=vic
以下引用feige(游客)在2006-3-29 10:33:17的评论:首先非常感谢您的回复!可我按照您说的做了,问题依旧。每次UA(A)打电话给UA(B)后,B一旦接起电话A端就输出到:Graphical MJSIP UA 1.0UA: REGISTRATIONUA: Registration success: 200 OKUA: RINGINGUA: ACCEPTED/CALLSelected format: LINEAR, 8000.0 Hz, 8-bit, Mono
……………………然后就陷入死循环。我看过他的源代码,就是执行到:while(player.getState()!=player.Realized);这句(我看了一下player.getState() = 200 也就是Realizing而Realized=300),但不知道为什么?过很久后A端输出:UA: Registration failure: Timeout……………………AckTransactionClient#3: changed transaction state: T_TerminatedUA: onCallAccepted()UA: ACCEPTED/CALLJMFAudioLauncher: launching JMF-Audio...
|
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
| 回复:mjSip学习笔记 |
|
feige(游客)发表评论于2006/3/29 10:33:17 | 首先非常感谢您的回复!
可我按照您说的做了,问题依旧。
每次UA(A)打电话给UA(B)后,B一旦接起电话
A端就输出到:
Graphical MJSIP UA 1.0
UA: REGISTRATION
UA: Registration success: 200 OK
UA: RINGING
UA: ACCEPTED/CALL
Selected format: LINEAR, 8000.0 Hz, 8-bit, Mono
List of devices: 1
device 0:DirectSoundCapture
MediaLocator: dsound://
Processor created
Processor configured
ContentDescriptor=raw.rtp
Processor realized
Receiver URL= rtp://:21000/audio
JMFAudioLauncher: launching JMF-Audio...
streams is [Lcom.sun.media.multiplexer.RawBufferMux$RawBufferSourceStream;@13e75a5 : 1
sink: setOutputLocator rtp://192.168.68.16:16108/audio/1
DataSink created
Dest= rtp://192.168.68.16:16108/audio/1 , RTP
DataSink opened
Start sending
Trying to realize the player
然后就陷入死循环。我看过他的源代码,就是执行到:while(player.getState()!=player.Realized);
这句(我看了一下player.getState() = 200 也就是Realizing而Realized=300),但不知道为什么?
过很久后A端输出:
UA: Registration failure: Timeout
events.log文件的内容如下:
SipProvider-5060: Date: 10:29:55.234 Wed 29 Mar 2006
SipProvider-5060: SipStack: mjsip stack 1.6
SipProvider-5060: new SipProvider(): 5060/udp
SipProvider-5060: udp is up
ExtendedInviteDialog#0: changed dialog state: D_INIT
ExtendedInviteDialog#0: changed dialog state: D_WAITING
TransactionServer#0: id: INVITE
TransactionServer#0: created
TransactionServer#0: start
TransactionServer#0: changed transaction state: T_Waiting
SipProvider-5060: adding SipProviderListener: INVITE
SipProvider-5060: 1 listeners: INVITE,
UA: REGISTRATION
RegisterAgent: Registering contact <sip:2223@192.168.68.13> (it expires in 3600 secs)
TransactionClient#1: id: 334060406272@192.168.68.13-1-REGISTER-192.168.68.13:5060-z9hG4bK65453
TransactionClient#1: created
TransactionClient#1: start
TransactionClient#1: changed transaction state: T_Trying
SipProvider-5060: adding SipProviderListener: 334060406272@192.168.68.13-1-REGISTER-192.168.68.13:5060-z9hG4bK65453
SipProvider-5060: 2 listeners: 334060406272@192.168.68.13-1-REGISTER-192.168.68.13:5060-z9hG4bK65453, INVITE,
SipProvider-5060: using transport udp
SipProvider-5060: Resolving host address '192.168.68.16'
SipProvider-5060: Sending message to udp:192.168.68.16:5060
10:29:56.250 Wed 29 Mar 2006, 192.168.68.16:5060/udp (368 bytes): REGISTER sip:192.168.68.16 SIP/2.0, sent
10:29:56.250 Wed 29 Mar 2006, 192.168.68.16:5060/udp (425 bytes): SIP/2.0 100 Trying, received
SipProvider-5060: received new SIP message
SipProvider-5060: DEBUG: transaction-id: 334060406272@192.168.68.13-1-REGISTER-192.168.68.13:5060-z9hG4bK65453
SipProvider-5060: message passed to transaction: 334060406272@192.168.68.13-1-REGISTER-192.168.68.13:5060-z9hG4bK65453
TransactionClient#1: changed transaction state: T_Proceeding
10:29:56.281 Wed 29 Mar 2006, 192.168.68.16:5060/udp (501 bytes): SIP/2.0 200 OK, received
SipProvider-5060: received new SIP message
SipProvider-5060: DEBUG: transaction-id: 334060406272@192.168.68.13-1-REGISTER-192.168.68.13:5060-z9hG4bK65453
SipProvider-5060: message passed to transaction: 334060406272@192.168.68.13-1-REGISTER-192.168.68.13:5060-z9hG4bK65453
TransactionClient#1: changed transaction state: T_Completed
RegisterAgent: Registration success: 200 OK
UA: Registration success: 200 OK
ExtendedInviteDialog#0: inside refuse()
ExtendedInviteDialog#0: inside refuse(403,Forbidden)
ExtendedInviteDialog#0: inside respond(403,Forbidden)
ExtendedInviteDialog#0: WARNING: Dialog isn't in "invited" state: cannot respond (403/D_WAITING/null)
ExtendedInviteDialog#0: inside cancel()
SipProvider-5060: removing SipProviderListener: INVITE
SipProvider-5060: 1 listeners: 334060406272@192.168.68.13-1-REGISTER-192.168.68.13:5060-z9hG4bK65453,
TransactionServer#0: changed transaction state: T_Terminated
ExtendedInviteDialog#0: inside bye()
ExtendedCall: calling "2224" <sip:2224@192.168.68.16>
ExtendedInviteDialog#1: changed dialog state: D_INIT
ExtendedInviteDialog#1: inside invite(callee,caller,contact,sdp)
ExtendedInviteDialog#1: inside invite(invite)
ExtendedInviteDialog#1: changed dialog state: D_INVITING
ExtendedInviteDialog#1: new dialog id: 729822251965@192.168.68.13-z9hG4bK78067334-null
SipProvider-5060: adding SipProviderListener: 729822251965@192.168.68.13-z9hG4bK78067334-null
SipProvider-5060: 2 listeners:
334060406272@192.168.68.13-1-REGISTER-192.168.68.13:5060-z9hG4bK65453,
729822251965@192.168.68.13-z9hG4bK78067334-null,
TransactionClient#2: id: 729822251965@192.168.68.13-1-INVITE-192.168.68.13:5060-z9hG4bK70758
TransactionClient#2: created
TransactionClient#2: start
TransactionClient#2: changed transaction state: T_Trying
SipProvider-5060: adding SipProviderListener: 729822251965@192.168.68.13-1-INVITE-192.168.68.13:5060-z9hG4bK70758
SipProvider-5060: 3 listeners:
334060406272@192.168.68.13-1-REGISTER-192.168.68.13:5060-z9hG4bK65453,
729822251965@192.168.68.13-z9hG4bK78067334-null,
729822251965@192.168.68.13-1-INVITE-192.168.68.13:5060-z9hG4bK70758,
SipProvider-5060: using transport udp
SipProvider-5060: Resolving host address '192.168.68.16'
SipProvider-5060: Sending message to udp:192.168.68.16:5060
10:29:59.765 Wed 29 Mar 2006, 192.168.68.16:5060/udp (563 bytes): INVITE sip:2224@192.168.68.16 SIP/2.0, sent
10:29:59.765 Wed 29 Mar 2006, 192.168.68.16:5060/udp (423 bytes): SIP/2.0 100 Trying, received
SipProvider-5060: received new SIP message
SipProvider-5060: DEBUG: transaction-id: 729822251965@192.168.68.13-1-INVITE-192.168.68.13:5060-z9hG4bK70758
SipProvider-5060: message passed to transaction: 729822251965@192.168.68.13-1-INVITE-192.168.68.13:5060-z9hG4bK70758
TransactionClient#2: changed transaction state: T_Proceeding
ExtendedInviteDialog#1: inside onTransProvisionalResponse(tc,mdg)
10:29:59.796 Wed 29 Mar 2006, 192.168.68.16:5060/udp (439 bytes): SIP/2.0 180 Ringing, received
SipProvider-5060: received new SIP message
SipProvider-5060: DEBUG: transaction-id: 729822251965@192.168.68.13-1-INVITE-192.168.68.13:5060-z9hG4bK70758
SipProvider-5060: message passed to transaction: 729822251965@192.168.68.13-1-INVITE-192.168.68.13:5060-z9hG4bK70758
ExtendedInviteDialog#1: inside onTransProvisionalResponse(tc,mdg)
UA: onCallRinging()
UA: RINGING
TransactionClient#1: Clearing timeout expired
SipProvider-5060: removing SipProviderListener: 334060406272@192.168.68.13-1-REGISTER-192.168.68.13:5060-z9hG4bK65453
SipProvider-5060: 2 listeners:
729822251965@192.168.68.13-z9hG4bK78067334-null,
729822251965@192.168.68.13-1-INVITE-192.168.68.13:5060-z9hG4bK70758,
TransactionClient#1: changed transaction state: T_Terminated
10:30:01.968 Wed 29 Mar 2006, 192.168.68.16:5060/udp (652 bytes): SIP/2.0 200 OK, received
SipProvider-5060: received new SIP message
SipProvider-5060: DEBUG: transaction-id: 729822251965@192.168.68.13-1-INVITE-192.168.68.13:5060-z9hG4bK70758
SipProvider-5060: message passed to transaction: 729822251965@192.168.68.13-1-INVITE-192.168.68.13:5060-z9hG4bK70758
TransactionClient#2: changed transaction state: T_Terminated
SipProvider-5060: removing SipProviderListener: 729822251965@192.168.68.13-1-INVITE-192.168.68.13:5060-z9hG4bK70758
SipProvider-5060: 1 listeners: 729822251965@192.168.68.13-z9hG4bK78067334-null,
ExtendedInviteDialog#1: inside onTransSuccessResponse(729822251965@192.168.68.13-1-INVITE-192.168.68.13:5060-z9hG4bK70758,msg)
ExtendedInviteDialog#1: inside onTransSuccessResponse(tc,msg)
ExtendedInviteDialog#1: changed dialog state: D_CALL
SipProvider-5060: removing SipProviderListener: 729822251965@192.168.68.13-z9hG4bK78067334-null
SipProvider-5060: 0 listeners:
ExtendedInviteDialog#1: new dialog id: 729822251965@192.168.68.13-z9hG4bK78067334-as278e6c90
SipProvider-5060: adding SipProviderListener: 729822251965@192.168.68.13-z9hG4bK78067334-as278e6c90
SipProvider-5060: 1 listeners: 729822251965@192.168.68.13-z9hG4bK78067334-as278e6c90,
AckTransactionClient#3: id: 729822251965@192.168.68.13-1-INVITE-192.168.68.13:5060-z9hG4bK53471
AckTransactionClient#3: created
AckTransactionClient#3: start
SipProvider-5060: using transport udp
SipProvider-5060: Resolving host address '192.168.68.16'
SipProvider-5060: Sending message to udp:192.168.68.16:5060
10:30:01.968 Wed 29 Mar 2006, 192.168.68.16:5060/udp (378 bytes): ACK sip:2224@192.168.68.16 SIP/2.0, sent
AckTransactionClient#3: changed transaction state: T_Terminated
UA: onCallAccepted()
UA: ACCEPTED/CALL
JMFAudioLauncher: launching JMF-Audio...
|
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
| 求助 |
人在旅途发表评论于2006/3/29 10:11:41 |
各位朋友,我碰到各问题.
当我用MjSIP的UA和其他SIPSERVER测试时,在REGISTER时返回了401(认证要求,MD5),UA添加了认证信息后再送,被SERVER接受;随后,UA发送了INVITE消息,SERVER又返回了407(认证要求,MD5),我又同样得添加了认证信息后再送,但SERVER就再也没有反映了.SERVER应该没问题,因为我用HARDPHONE试过了,同样有认证要求,但都顺利通过了,我想是MjSIP的UA和它不匹配吧,有人有这个问题的经验吗?
以下为blog主人的回复:
已经解决,是BRANCH值没变的原因,请看更改后的主贴.
|
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
| 回复:mjSip学习笔记 |
|
fchenscut(游客)发表评论于2006/3/28 19:51:14 | 非常感谢blog主人的提供源码和配置的热诚。
Thanks a lot!!!
|
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
| 回复:mjSip学习笔记 |
|
fchenscut(游客)发表评论于2006/3/28 19:48:23 | 不好意思,现在好了。
声音混浊的缘故是我打开了不必打开的很多播放选项。现在听到的声音很清,但有回音,延迟应该小于半秒吧!我是在同一台电脑上测试的。
|
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
| 回复:mjSip学习笔记 |
|
fchenscut(游客)发表评论于2006/3/28 19:41:52 | 连接刚成功的时候,听到的声音是很不错的。
但是,渐渐地,会出现很大的钻井似的噪音,越来越大以致盖过了要传输的原音。不知何故。
|
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
| 回复:mjSip学习笔记 |
|
fchenscut(游客)发表评论于2006/3/28 19:30:40 | 接下面的那条信息。
注意要把配置文件*.cfg里面的“use_jmf=yes”前面的#去掉。
|
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
| 回复:mjSip学习笔记 |
|
fchenscut(游客)发表评论于2006/3/28 19:27:49 | 这位朋友,我找到没能通话的原因了。下面我测试的log提示:
Selected format: LINEAR, 8000.0 Hz, 8-bit, Mono (-----注意这里,原因就出在这里-----)List of devices: 1device 0:DirectSoundCaptureMediaLocator: dsound://Processor createdProcessor configuredContentDescriptor=raw.rtpProcessor realizedReceiver URL= rtp://:4000/audioJMFAudioLauncher: launching JMF-Audio...streams is [Lcom.sun.media.multiplexer.RawBufferMux$RawBufferSourceStream;@1b09468 : 1sink: setOutputLocator rtp://211.66.17.147:3000/audio/1DataSink createdDest= rtp://211.66.17.147:3000/audio/1 , RTPDataSink openedStart sendingTrying to realize the playerPlayer realizedStop sendingPlayer stopped
注意到红色部分文字,程序是通过系统的mono来录音,然后再发送出去的.
所以您如果要测试的话,请打开你的windows(如果是这种系统的话)的音频属性,选择录音选项,会发现一个“mono mix”,然后选择这个来录音,就会听到你要传输的音频了。
我在同一台电脑上试了一下,简单地播放一个音乐文件,可以顺利听到由UA返传回来的声音,不过很混浊难听。
以下引用feige(游客)在2006-3-28 17:27:46的评论:不好意思再次打扰拉,我UA联系对方,对方的电话铃可以响,但就是无法听到双方的声音。每次都输出JMFAudioLauncher: launching JMF-Audio...streams is [Lcom.sun.media.multiplexer.RawBufferMux$RawBufferSourceStream;@7be8c2 : 1sink: setOutputLocator rtp://192.168.68.16:13596/audio/1DataSink createdDest= rtp://192.168.68.16:13596/audio/1 , RTPDataSink openedStart sendingTrying to realize the player然后就停在这啦,看了他的Log后也不太清楚:…………………………………………………………………………上面是他的部分log其实我的目的是想利用MJSIP提供的电话转接功能我之前用Jain-Sip-Applet-Phone已经实现了Phone to Pc 和Pc to Phone但 Refer功能做不出来,我按照SIP中对Refer的定义写了Refer,但每次执行完毕后refer-by一方已经收到了Accepted信息,但refer-to一方死活就是没有任何反应,我感觉Accepted好像是VOIPServer发送过来的,不知搂主有没有这方面的经验,还望给予帮忙,先谢谢啦
|
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
| 回复:mjSip学习笔记 |
|
fchenscut(游客)发表评论于2006/3/28 19:10:43 |
配置文件a.cfg中有这么几行:
#bin_rat="c:\program files\mbone\rat"#bin_vic="c:\program files\mbone\vic"bin_rat=ratbin_vic=vic
谁知道是干什么用的?是用来配置多媒体选项的吗?
按照上面提示的路径我找不到那些文件.请问是不是要额外安装的?
以下为blog主人的回复:
这大概是和JMF不同的语音系统吧,没研究过.
|
| 个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除 |
|