现在的位置: 首页 > 综合 > 正文

IAX测试

2012年07月23日 ⁄ 综合 ⁄ 共 16077字 ⁄ 字号 评论关闭

最近稍微了解了一下IAX协议,全称为Inter-Asterisk eXchange,即Asterisk内部交换协议。和SIP相类似,它也是一个传输协议。但是IAX的一个比较特殊的地方则是它仅仅只使用一个UDP端口(4569)来传输通道信号以及RTP流。也由于单端口可能更集中的关系,因此IAX更加适合NAT环境以及对防火墙的穿透。现在IAX版本为IAX2版本,版本1已经放弃淘汰了。所以目前在很多地方看到所提到的IAX协议,其实默认都是说的是IAX2协议。
另外,IAX还有一个特点,就是它可以将多个会话集中在一个数据流里传输,实际上的做法就是将多个数据流用一个数据报报头表示和概括。也就说IAX拥有中继Trunk能力,并也因为这个原因,IAX可以在中继流量的时候在一定程度上减小对带宽的消耗和需求。
这一话的目的也是非常简单,没有复杂的配置,仅仅是为了实现让个IAX的终端能够注册上Asterisk并且能够互相呼叫并和对方通话的功能。
系统环境:CentOS 5.0 Linux操作系统
             Asterisk 1.4.5版本
             IAX终端为iaxLite SoftPhone

一.修改配置文件
1.设定IAX配置文件:
在Asterisk当中IAX的特性配置文件都保存在iax.conf这个独立的配置文件当中。
[root@asterisk-test1 ~]# vi /etc/asterisk/iax.conf
———————————————–
与Asterisk其他配置文件一样,iax.conf中也是采用分段配置的结构,并且也是使用分号“;”来注释掉配置项的。
[general]
全局配置段“general”里面可以写上对IAX全局的全局配置信息,这里配置的条目将影响整个Asterisk中IAX的性能。
bindport=4569
指定IAX2协议的监听端口,这里我使用默认的4569。

bindaddr=0.0.0.0
指定IAX2协议监听的网络接口。这里我设定为0.0.0.0表示对系统的所有网络接口进行监听。                             
;iaxcompat=yes
设定IAX的协作性和兼容性。如果打算使用分层式交换或者其他一些方案,而这些都会在拨号方案查找时造成延迟的时候,应该将这项设定为“yes”。启用该项会对系统性能造成一个小小的冲击。这个选项会造成Asterisk在收到一个IAX拨号规则请求时衍生一个分开独立的线程,而不是傻堵在那里等待一个回应。这里我采用默认的“yes”。
;nochecksums=no
设定关闭UDP校验。如果设定“yes”关闭UDP校验的话,那么在你的系统上将不会为UDP计算以及检察校验和。这里我采用默认的“no”,表示启用UDP校验。
;delayreject=yes
设定拒绝硬直。为了提高系统安全以及防止暴力密码破解攻击,开启拒绝硬直功能后,验证失败的对象必须要经过一段时间的硬直状态才能进行下一次验证的尝试。这里我也采用默认的“yes”,表示开启拒绝硬直功能。
;amaflags=default
设定AMA标记类型。AMA的全称是“Automated Message Accounting”,自动消息记帐。可以为IAX呼叫指定一个全局的默认AMA标记类型,这些标记将会在生成CDR时被用到,而这些记录的类型必须是以下种类:
(1)default: 默认,设定为系统默认。这里我使用默认的“Default”类型。
(2)omit: 忽略,不记录呼叫。
(3)billing: 计费,打上标记作为计费用。
(4)documentation: 文档说明,打上标记作为文档说明。
;adsi=no
设定是否开启ADSI功能。所谓ADSI全称就是“Analog Display Services Interface”即模拟显示服务接口,大致意思就是一种让模拟电话也能处理数字信息服务的接口,就像那种带有屏幕而又通过电话线连接的电话机,这些电话机上面可以支持比如发短信或者其他的服务功能,但是这些都需要你平台支持ADSI服务接口。现在当然不需要啦,所以我选择默认的“no”,关闭掉它。
;accountcode=lss0101
设定帐户代码。指定一个默认全局的帐户代码,也可以为每个帐户指定各自的帐户代码,这将会记录到CDR当中去。这里暂时不涉及到计费以及CDR,所以使用默认的注释掉该项。
;language=en
设定对用户的全局默认语言种类,也可以为每个帐户指定各自的语言种类。如果忽略该项的话,就使用默认的英语语言。这里使用默认的英语。
;mohsuggest=default
;mohinterpret=default
设定电话挂起的时候通道里播放的内容。如果是“default”的话,那么当电话挂起的时候,通道里就会播放拨号规则里指定的音乐。如果是“passthough”的话,就会用消息信号代替。这里使用默认的“default”。

接下来是编解码设定部分:
bandwidth=low
设定带宽。指定低、中、高带宽来控制编解码。这里使用默认的低带宽。
disallow=all
这里首先关闭所有的编解码。目的是为了只开放指定允许的编解码。  
allow=gsm   
然后允许GSM的编解码。在IAX当中使用GSM编解码比较多,因为比较节省带宽。
allow=g729
然后再允许G.729的编解码。G.729也是非常优秀的编解码,但是这存在版权问题,貌似在没有获得许可的情况下,你只能用G.729进行解码而不能编码,否则要负法律责任的哟。
jitterbuffer=no
设定抗抖动缓冲。设定是否要全局缓冲,在不稳定的网络环境下应该启用,一般情况不需要。因为终端设备会对抖动处理缓冲。使用默认的“no”。
forcejitterbuffer=no
设定强制抗抖动缓冲。一般来说应该是在通信通道上做抗抖动的缓冲,而不是在交换系统局端上作,因为终端设备会自己处理抖动缓冲,所以一般也不需要。使用默认的“no”。
;maxjitterbuffer=1000
设定最大抗抖动缓冲。单位是毫秒,设定得合适会使抖动问题得到改善,设定过大会造成额外的延迟。
;maxjitterinterps=10
设定最大抖动补偿。设定在一次返回列中抗抖动缓冲应该返回的补偿帧的最大数量。
;resyncthreshold=1000
设定重新同步阀值。当抗抖动缓冲注意到一个巨大的改变可能造成持续好几帧发生延迟的时候,它就会去重新同步。设定“-1”表示关闭重新同步功能。

至于IAX中继设定部分,这里就不详细展开交待了。

;trunkfreq=20   
;trunktimestamps=yes
;authdebug=no
;regcontext=iaxregistrations
autokill=yes
;rtcachefriends=yes 
;rtupdate=yes  
;rtautoclear=yes 
;rtignoreregexpire=yes

接下来是IAX对象设定部分:
[iax](!)
这里设定的是iax小节,后面的“(!)”表示它是一个属性抽象类,它本身不是对象实例,却定义了很多属性值,提供其他实体来继承它的属性。
type=friend
指定类型为Friend“友端”,即可以对Asterisk进行呼叫也可以被Asterisk呼叫的这种双向类型终端。
其他的还有Peer“对端”,即只能作为被Asterisk呼叫的类型终端。
以及的还有User“用户端”,即只能作为呼叫Asterisk的类型终端。
host=dynamic
指定终端主机位置。这里可以取2种值:
static“静态”表示服务的终端对象的IP是固定已知的;
dynamic“动态”表示服务的终端对象IP是动态的不确定的,每次要联系Asterisk的话就必须要注册上来。
port=4569
设定IAX监听端口。其实和全局里设定的是一样的话就可以省去。
context=demo2
指定该段内的对象所使用的拨号规则,全部对应extensions.conf文件中的[demo2]小节内定义的规则。

[8801](iax)
这里定义了名字为“8801”的小节,后面跟“(iax)”,这表示该段定义的对象将继承[iax]定义段内的属性。
username=8801
指定该对象的用户名。
secret=123456
指定该对象的密码。
[8802](iax)
username=8802
sercret=123456
同样,对象8802也继承sip抽象类中的公共属性。
———————————————–

2.配置拨号规则文件
[root@asterisk-test1 ~]# vi /etc/asterisk/extensions.conf
———————————————–
配置方式也是同样,通过定义每一个小节,再在每一个小节中定义详细的属性。
这里比较重要的是“general”和“globals”这两个默认就有的小节,也是起到“全局属性”的作用,请根据实际情况确定,但请不要删除这两个小节。其他的小节都是可以订制、删除修改的。
[general]
static=yes
writeprotect=no
autofallthrough=no
clearglobalvars=no
priorityjumping=no
[globals]
CONSOLE=Console/dsp                             
IAXINFO=guest                                   ; IAXtel username/password
TRUNK=Zap/g2                                    ; Trunk interface
TRUNKMSD=1                                      ; MSD digits to strip (usually 1 or 0)
其他的不重要的小节我都删除了,这里我自定义一个简单的拨号规则。小节取名为“demo2”,与iax.conf里面的context项中指定的规则小节名对应。

[demo2]
exten => _88.,1,Dial(IAX2/${EXTEN},20,r)
(1)规则就一条,使得8801和8802可以互相拨打。当中的格式简要讲述一下。更多的请参考Asterisk的手册,这里不详细展开。
(2)开头部分“exten =>”表示,也可以用“exten =”表示。并且在一个小节内可以定义多条exten语句。
(3)之后的“_88.”表示匹配上所有“88”开头的拨号,“.”表示不限制长度的任意字符。
(4)然后的“1”表示优先级,我喜欢称作为“执行次序”。“1”表示第一步执行的意思,如果后续还需要执行其他动作的话,可以继续写多条exten语句,并且用递增执行次序依次设计下去。
(5)接着的“Dail()”表示“执行动作”,这里是表示拨号的执行动作。更规范的说,这个是APP应用程序。
(6)括号当中又分成3个部分。第一个IAX2表示拨号动作中拨向的通道是IAX2协议的通道。${EXTEN}则一个变量,其值就是用户实际拨打的号码。如果你拨打8801那么${EXTEN}的值就是8801。
(7)括号内的“20”,表示等待时间单位秒,如果有多个执行次序,即一组拨号规则的话,如果过了20秒,就跳跃执行次序(跳跃的幅度是101个优先级)。
(8)最后的“r”表示强行播放振铃。在拨打对方等待对方接通的时候,就能听到回振铃音。
———————————————–
二.测试:
1.进入Asterisk控制台刷新配置。
[root@asterisk-test1 ~]# /usr/local/asterisk/sbin/asterisk -crvvvvv
———————————————–
Asterisk 1.4.5, Copyright (C) 1999 - 2007 Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type ’core show warranty’ for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type ’core show license’ for details.
=========================================================================
  == Parsing ’/etc/asterisk/asterisk.conf’: Found
  == Parsing ’/etc/asterisk/extconfig.conf’: Found
Connected to Asterisk 1.4.5 currently running on asterisk-test1 (pid = 1929)
Verbosity is at least 5

asterisk-test1*CLI> reload
当Asterisk需要完全重载所有配置的时候,就需要在控制台当中使用reload命令,而没有必要去重新启动服务。重新载入当中会产生大量信息,这里只贴出一部分。
……
……
    – Reloading module ’chan_iax2.so’ (Inter Asterisk eXchange (Ver 2))
  == Parsing ’/etc/asterisk/iax.conf’: Found
[Oct 30 13:48:44] NOTICE[4395]: chan_iax2.c:9071 set_config: Ignoring bindport on reload
[Oct 30 13:48:44] NOTICE[4395]: chan_iax2.c:9130 set_config: Ignoring bindaddr on reload
这个部分是重载IAX配置以及模块。
…..
…..
[Oct 30 13:48:44] NOTICE[4395]: pbx_ael.c:3984 pbx_load_module: AEL load process: compiled config file name ’/etc/asterisk/extensions.ael’.
[Oct 30 13:48:44] NOTICE[4395]: pbx_ael.c:3987 pbx_load_module: AEL load process: merged config file name ’/etc/asterisk/extensions.ael’.
[Oct 30 13:48:44] WARNING[4395]: pbx.c:6236 ast_context_verify_includes: Context ’ael-local’ tries includes nonexistent context ’ael-parkedcalls’
[Oct 30 13:48:44] WARNING[4395]: pbx.c:6236 ast_context_verify_includes: Context ’ael-dundi-e164-local’ tries includes nonexistent context 
‘ael-dundi-e164-canonical’
[Oct 30 13:48:44] WARNING[4395]: pbx.c:6236 ast_context_verify_includes: Context ’ael-dundi-e164-local’ tries includes nonexistent context 
‘ael-dundi-e164-customers’
[Oct 30 13:48:44] WARNING[4395]: pbx.c:6236 ast_context_verify_includes: Context ’ael-dundi-e164-local’ tries includes nonexistent context 
‘ael-dundi-e164-via-pstn’
[Oct 30 13:48:44] NOTICE[4395]: pbx_ael.c:3990 pbx_load_module: AEL load process: verified config file name ’/etc/asterisk/extensions.ael’.
    – Reloading module ’pbx_dundi.so’ (Distributed Universal Number Discovery (DUNDi))
  == Parsing ’/etc/asterisk/dundi.conf’: Found
  == MGCP Listening on 0.0.0.0:2727
  == Using TOS bits 0
这些是重载拨号规则部分。
……
……
独立重新载入IAX,这样不大会影响Asterisk其他部分。
asterisk-test1*CLI> iax2 reload
  == Parsing ’/etc/asterisk/iax.conf’: Found
[Oct 30 14:40:54] NOTICE[4704]: chan_iax2.c:9071 set_config: Ignoring bindport on reload
[Oct 30 14:40:54] NOTICE[4704]: chan_iax2.c:9130 set_config: Ignoring bindaddr on reload
  == Parsing ’/etc/asterisk/users.conf’: Found
    – Seeding ’8801′ at 192.168.0.199:4569 for 60
    – Seeding ’8802′ at 192.168.0.149:4569 for 60
  == Loaded firmware ’iaxy.bin’
  == Parsing ’/etc/asterisk/iaxprov.conf’: Found
    – Loaded provisioning template ’default’
———————————————–

2.注册终端
在这次测试当中我使用的是iaxLite SoftPhone。注册帐户分别是8801和8802,密码123456。
———————————————–
    – Registered IAX2 ’8801′ (AUTHENTICATED) at 192.168.0.199:4569
[Oct 30 14:06:49] NOTICE[2018]: chan_iax2.c:5699 update_registry: Restricting registration for peer ’8801′ to 60 seconds (requested 300)
这个是8801注册上来后在Asterisk控制台上看到的信息。
    – Registered IAX2 ’8802′ (AUTHENTICATED) at 192.168.0.149:4569
[Oct 30 14:07:04] NOTICE[2020]: chan_iax2.c:5699 update_registry: Restricting registration for peer ’8802′ to 60 seconds (requested 300)
这个是8802注册上来后在Asterisk控制台上看到的信息。
———————————————–

3.察看注册信息
asterisk-test1*CLI> iax2 show peers
———————————————–
Name/Username    Host                 Mask             Port          Status    
8802/8802        192.168.0.149   (D)  255.255.255.255  4569          Unmonitored
8801/8801        192.168.0.199   (D)  255.255.255.255  4569          Unmonitored
2 iax2 peers [0 online, 0 offline, 2 unmonitored]
———————————————–

4.互相呼叫
(1)8801呼叫8802,8802接通并且由8801主叫方挂断。
———————————————–
    – Remote UNIX connection
    – Accepting AUTHENTICATED call from 192.168.0.199:
    从通过验证端192.168.0.199发起呼叫。
       > requested format = g729,
    请求使用的编解码是G.729。
       > requested prefs = (),
       > actual format = gsm,
    实际使用格式为GSM。
       > host prefs = (gsm|g729),
       > priority = mine
    – Executing [8802@demo2:1] Dial(”IAX2/8801-3″, ”IAX2/8802|20|r”) in new stack
    按照拨号方案demo2来执行拨号8802。
    – Called 8802> 
    被叫方8802
    – Call accepted by 192.168.0.149 (format gsm)
    呼叫被192.168.0.149接受了,格式为GSM。
    – Format for call is gsm
    呼叫格式为GSM。
    – IAX2/8802-6 is ringing
    用户8801呼叫用户8802,编码是GSM,并且8802已经在振铃。
    – IAX2/8802-6 answered IAX2/8801-5
    用户8802应答了用户8801。
    – Channel ’IAX2/8801-5′ ready to transfer
    通道IAX2/8801-5已经准备好传输。
    – Channel ’IAX2/8802-6′ ready to transfer
    通道IAX2/8802-6也已经准备好传输。
    – Releasing IAX2/8802-6 and IAX2/8801-5
    释放IAX2/8802-6以及IAX2/8801-5通道建立。
  == Spawn extension (demo2, 8802, 1) exited non-zero on ’IAX2/8801-5′
    – Hungup ’IAX2/8801-5′
    最后由8801-5挂断连接。
———————————————–

(2)8802呼叫8801,8801接通。
———————————————–
    – Remote UNIX connection
    – Accepting UNAUTHENTICATED call from 192.168.0.149:
       > requested format = g729,
       > requested prefs = (),
       > actual format = gsm,
       > host prefs = (gsm|g729),
       > priority = mine
    – Executing [8801@demo2:1] Dial(”IAX2/8802-6″, ”IAX2/8801|20|r”) in new stack
    – Called 8801
    – Call accepted by 192.168.0.199 (format gsm)
    – Format for call is gsm
    – IAX2/8801-7 is ringing
    – IAX2/8801-7 answered IAX2/8802-6
    – Channel ’IAX2/8801-7′ ready to transfer
    – Channel ’IAX2/8802-6′ ready to transfer
    – Releasing IAX2/8802-6 and IAX2/8801-7
———————————————–

三.问题:
通是通了,通话也没有什么问题,但是还有几个地方不是非常明白:
1.口令错误的终端照样可以以(UNAUTHENTICATIED)的方式注册到Asterisk上并且还能呼叫连接。
2.被叫端不能主动挂断电话。
3.有个别几通电话,主叫方已经断线了,被叫方竟然还显示自己是连接状态并且挂不断。
目前还没有解决这些问题,等解决了把原因以及解决方法帖上。

最后要提一个比较有意思的地方,IAX的正确读法好像应该是“eeks”,而不是字面上那样读成“ai-ei-eks”。呵呵,据说这还是一个业内人士和素人一个参考区别呢。

 

之前在IAX通信测试的时候,遇到了以下几个问题。本话就是特别来给与解决的方法。
问题如下:
—————————————————————————————-
1.(IAX)口令错误的终端照样可以以(UNAUTHENTICATIED)的方式注册到Asterisk上并且还能呼叫连接。
2.(IAX)被叫端不能主动挂断电话。
3.(IAX)有个别几通电话,主叫方已经断线了,被叫方竟然还显示自己是连接状态并且挂不断。
4. 编码G.729转换错误。
—————————————————————————————-
其实,第2和第3是同一个问题。

一.交待环境和相关配置:
1.IAX的配置情况
[root@asterisk-test1 ~]# vi /etc/asterisk/iax.conf
—————————————————————————————-
[iax](!)
type=friend
context=test
disallow=all
allow=gsm
qualify=yes
host=dynamic
transfer=no
auth=md5
[8801](iax)
username=8801
secret=123456
context=test
[8802](iax)
username=8802
secret=123456
context=test
—————————————————————————————-

2.拨号规则配置情况
[root@asterisk-test1 ~]# vi /etc/asterisk/extensions.conf
—————————————————————————————-
[test]
exten => _880X,1,Dial(IAX2/${EXTEN},,r)
exten => _990X,1,Dial(SIP/${EXTEN},,r)
exten => h,1,hangup
—————————————————————————————-

3.进入控制台
[root@asterisk-test1 ~]# asterisk -crvvvv
—————————————————————————————-
Asterisk 1.4.5, Copyright (C) 1999 - 2007 Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type ’core show warranty’ for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type ’core show license’ for details.
=========================================================================
  == Parsing ’/etc/asterisk/asterisk.conf’: Found
  == Parsing ’/etc/asterisk/extconfig.conf’: Found
Connected to Asterisk 1.4.5 currently running on asterisk-test1 (pid = 1728)
Verbosity was 3 and is now 4
    – Remote UNIX connection
asterisk-test1*CLI> 
—————————————————————————————-
二.解决第1个问题:
“口令错误的终端照样可以以(UNAUTHENTICATIED)的方式注册到Asterisk上并且还能呼叫连接。”
首先,要清楚3种终端类型:
(1)user“用户端”:用户终端,用户终端会注册到本地系统,它是“来话”的对象。
(2)peer“对等端”:对等系统端,本地系统要与对等端连接,它是“去话”的对象。
(3)friend“友端”:用户端+对等端。同时具有这两种特性。
对于终端注册到本地系统来说,user和friend需要对终端进行验证,而peer端不需要。注册验证的流程基本上如下:
(1)接受到终端请求时先察看有没有该终端的username。
(A2)如果有username,那么就会去通过该终端记录的secret来审核口令。如果口令匹配失败,立即拒绝。
(A3)如果secret审核通过,那么就进一步看有么有permit/deny过滤过则,如果遇到禁止规则,立即拒绝。
(B2)如果没有改终端的username,那么就会查找有没有[guest]的用户记录,并采用guest的属性登陆。
(B3)如果没有guest记录的话,采用匿名方式,该方式的权限基本上为无。
因此,这里我采用friend端让IAX终端注册上来。指定好username和secret。

1.注册终端
—————————————————————————————-
先验证注册8801:8801完全匹配username和secret。
    – Registered IAX2 ’8801′ (AUTHENTICATED) at 192.168.0.199:4569
[Nov  6 08:58:25] NOTICE[1805]: chan_iax2.c:5699 update_registry: Restricting registration for peer ’8801′ to 60 seconds (requested 300)

非法登入8802:8802故意输入错误的secret。
[Nov  6 08:59:05] NOTICE[1805]: chan_iax2.c:5111 register_verify: Host 192.168.0.149 failed MD5 authentication for ’8802′ (6365d7727b761fa22ccae275d8435164 != 637780cc9633f4656dc2cea80410827f)
登陆被拒绝,终端显示“regist refused”。不会让8802注册上来。也不能进行呼叫,也不会被呼叫到。
—————————————————————————————-

2.察看终端信息
asterisk-test1*CLI> iax2 show peers
—————————————————————————————-
Name/Username    Host                 Mask             Port          Status    
8802/8802        (Unspecified)   (D)  255.255.255.255  0             UNKNOWN   
8801/8801        192.168.0.199   (D)  255.255.255.255  4569          OK (5 ms) 
2 iax2 peers [1 online, 1 offline, 0 unmonitored]
—————————————————————————————-

3.进行呼叫
这里我做了一个测试,让8802成功注册上来后,再把8802的口令改成错误的。
—————————————————————————————-
合法的8801呼叫非法的8802 可以进行呼叫并且能够接通
    – Accepting AUTHENTICATED call from 192.168.0.199:
       > requested format = gsm,
       > requested prefs = (),
       > actual format = gsm,
       > host prefs = (gsm),
       > priority = mine
    – Executing [8802@test:1] Dial(”IAX2/8801-19″, ”IAX2/8802||r”) in new stack
    – Called 8802
    – Call accepted by 192.168.0.149 (format gsm)
    – Format for call is gsm
    – IAX2/8802-20 is ringing
    – IAX2/8802-20 answered IAX2/8801-19
    – Hungup ’IAX2/8802-20′
  == Spawn extension (test, 8802, 1) exited non-zero on ’IAX2/8801-19′
    – Executing [h@test:1] Hangup(”IAX2/8801-19″, ”") in new stack
  == Spawn extension (test, h, 1) exited non-zero on ’IAX2/8801-19′
    – Hungup ’IAX2/8801-19′

非法的8802呼叫合法的8801,但是由于呼叫的时候还需要一次验证,因此非法的终端是不能呼叫的。
[Nov  6 09:04:01] NOTICE[1811]: chan_iax2.c:7301 socket_process: Host 192.168.0.149 failed to authenticate as 8802
—————————————————————————————-
三.解决第2和第3个问题:
“(IAX)被叫端不能主动挂断电话。有个别几通电话,主叫方已经断线了,被叫方竟然还显示自己是连接状态并且挂不断。”
遇到这个问题,要在iax.conf当中指定以下该属性。
—————————————————————————————-
transfer=no
—————————————————————————————-
该问题就能得到解决,被叫能够顺利挂断。
四.解决第4个问题:
“编码G.729转换错误。”
—————————————————————————————-
之前遇到的问题的现象如下。
    – Executing [9901@demo:1] Dial(”SIP/9902-09a17100″, ”SIP/9901|20|r”) in new stack
    – Called 9901> 
    – SIP/9901-09a56000 is ringing
[Oct 25 11:22:25] WARNING[2490]: channel.c:2947 set_format: Unable to find a codec translation path from g729 to gsm
关键提示:找不到一个能够将G.729转成GSM的编解码途径。
[Oct 25 11:22:25] WARNING[2490]: channel.c:2947 set_format: Unable to find a codec translation path from g729 to gsm
    – SIP/9901-09a56000 answered SIP/9902-09a17100
    – Packet2Packet bridging SIP/9902-09a17100 and SIP/9901-09a56000
    – Started music on hold, class ’default’, on SIP/9901-09a56000
[Oct 25 11:22:35] WARNING[3892]: channel.c:2947 set_format: Unable to find a codec translation path from g729 to slin
[Oct 25 11:22:35] WARNING[3892]: res_musiconhold.c:247 ast_moh_files_next: Unable to open file ’/var/lib/asterisk/moh/fpm-calm-river’: No such file or 
directory
    – Stopped music on hold on SIP/9901-09a56000
[Oct 25 11:22:43] NOTICE[3892]: rtp.c:1274 ast_rtp_read: Unknown RTP codec 126 received from ’192.168.0.20′
关键提示:从192.168.0.20上收到未知的RTP编码。
—————————————————————————————-
从现象上来看,似乎G.729的编码转换有问题。其实我找一下原因,非常简单的道理。

1.找到模块存放路径
编解码的支持,是通过Asterisk的模块来实现的,先找一下模块的调用路径。
[root@asterisk-test1 ~]# cat /etc/asterisk/asterisk.conf|grep mod
—————————————————————————————-
astmoddir => /usr/local/lib/asterisk/modules
—————————————————————————————-

2.然后过滤出所有编解码模块
[root@asterisk-test1 ~]# ll /usr/local/lib/asterisk/modules/|grep codec
—————————————————————————————-
-rwxr-xr-x 1 root root  123440 Nov  5 09:09 codec_adpcm.so
-rwxr-xr-x 1 root root  118974 Nov  5 09:09 codec_alaw.so
-rwxr-xr-x 1 root root  116414 Nov  5 09:09 codec_a_mu.so
-rwxr-xr-x 1 root root  143839 Nov  5 09:09 codec_g726.so
-rwxr-xr-x 1 root root  557278 Nov  5 09:09 codec_gsm.so
-rwxr-xr-x 1 root root  857318 Nov  5 09:09 codec_ilbc.so
-rwxr-xr-x 1 root root  434020 Nov  5 09:09 codec_lpc10.so
-rwxr-xr-x 1 root root  118980 Nov  5 09:09 codec_ulaw.so
—————————————————————————————-
可以发现,Asterisk默认没有G.729,因此不能支持,所以也不能编码转换成G.729。因为G.729编解码是有版权的。

OK,以前遇到的4个问题,在这里做了解决和回答。

抱歉!评论已关闭.