吴伟贤のBlog

Feed Rss

freeswitch Auto NAT

11.28.2012, freeswitch Auto NAT已关闭评论, freeswitch, by .

转自:http://blog.csdn.net/jizha/article/details/6090718

 

From FreeSWITCH Wiki

说明

FreeSWITCH的自动穿透机制使用NAT-PMP或者UPnP发现外部IP地址(external IP address),不再需要搜寻STUN服务。实现NAT功能的设备(如路由器等)必须支持UPnP或NAT-PMP,以便FreeSWITCH的自动穿透机制正常使用。在自动穿透机制正常运转后,要做的只是简单的配置一下sip profile文件。

注意:

1、仍推荐你为你的sip服务器提供商准备第二份配置文件。默认的conf/sip_profiles/external.xml文件是特别为(sip服务)提供商而准备的。

2、nat自动穿透机制只应用NAT-PMP与UPnP。如果应用失败,则不会再回滚应用nat机制。

如需使用 STUN,需要设置外部 rtp地址( external rtp)和外部 sip地址( external sip)。

3、从SVN版本15916开始,在/usr/local/freeswitch/conf/sip_profile/internal.xml 和 external.xml中使用新的设置项:autonat:IP,如下所示:

   <param name="ext-rtp-ip" value="autonat:xxx.yyy.zzz.aaa"/>
<param name="ext-sip-ip" value="autonat:xxx.yyy.zzz.aaa"/>

这对于NAT-PMP 和UPnP 机制总是出问题的路由器来说非常有用。

安装步骤

从一个默认配置文件开始:

  • 如果你的配置文件版本比较老(在 r13618 之前),在 conf/sip_profiles/internal.xml 找到下面两行:
    <!– <param name=”ext-rtp-ip” value=”$${external_rtp_ip}”/> –>
    <!– <param name=”ext-sip-ip” value=”$${external_sip_ip}”/> –>

  • 取消下面两行的注释,并修改如下:

  <param name="ext-rtp-ip" value="auto-nat"/>

<param name="ext-sip-ip" value="auto-nat"/>
  • 重启 FreeSWITCH 。输入命令“ sofia status” ,得到的输出如下所示:

API CALL [sofia(status)] output:
Name Type Data State
=================================================================================================
internal profile sip:mod_sofia@192.168.1.103:5060 RUNNING (1)
192.168.1.103 alias internal ALIASED
default alias internal ALIASED
internal-ipv6 profile sip:mod_sofia@[::1]:5060 RUNNING (0)
=================================================================================================
2 profiles 2 aliases

  • 输入命令“ sofia status profile internal ” ,输出如下所示:

API CALL [sofia(status profile internal)] output:
=================================================================================================
Name internal
Domain Name N/A
DBName sofia_reg_internal
Pres Hosts
Dialplan XML
Context public
Challenge Realm auto_from
RTP-IP 192.168.1.103
Ext-RTP-IP 67.182.63.90
SIP-IP 192.168.1.103
Ext-SIP-IP 67.182.63.90
URL sip:mod_sofia@192.168.1.103:5060
BIND-URL sip:mod_sofia@192.168.1.103:5060
HOLD-MUSIC local_stream://moh
OUTBOUND-PROXY N/A
CODECS G7221@32000h,G7221@16000h,G722,PCMU,PCMA,GSM
TEL-EVENT 101
DTMF-MODE rfc2833
CNG 13
SESSION-TO 0
MAX-DIALOG 0
NOMEDIA false
LATE-NEG false
PROXY-MEDIA false
AGGRESSIVENAT false
STUN-ENABLED true
STUN-AUTO-DISABLE false
CALLS-IN 0
FAILED-CALLS-IN 0
CALLS-OUT 1
FAILED-CALLS-OUT
Registrations:
=================================================================================================
=================================================================================================

  • 注意命令输出中含有“ Ext-RTP-IP” 和“ Ext-SIP-IP” 的两行,如下所示:

Ext-RTP-IP              67.182.63.90

Ext-SIP-IP 67.182.63.90
  • 如果上面的输出中含有公共 IP 地址(即路由器对外公布的地址),则代表自动穿透正在运行。通过检查 nat 设置可以看出通过 UPnP/NAT-PMP 获取的公共 IP 地址就是

    路由器等网络设备与外部交互的地址。

输入命令“ nat_map status” ,来判断 nat_map 是否在工作。输入如下所示:

Nat Type: UPNP, ExtIP: 76.237.11.11
port,proto,proto_num,sticky
5060,udp,0,0
5060,tcp,1,0
5080,udp,0,0
5080,tcp,1,0
4 total.

通过查看启动过程中的输出的一条调试信息来确定外部 IP 地址有没有被检测到:

2009-09-11 09:42:55.962276 [INFO] switch_nat.c:406 NAT detected type: upnp, ExtIP: '83.59.46.46'

NOTE  : 不管上面怎么配置都会启动 NAT 检测。如需关闭,使用 “-nonat” 选项启动 freeswitch 即可。

拨打电话测试

在这个测试中我使用的是 portaudio, 当然你也可以注册 sip 电话来测试。

我们将会使用 FreeSWITCH 公共会议回声测试,来验证两个方向的语音。如果拨打的电话能听到自己的回声,证明一切正常。下面是一个样例:

freeswitch> pa call sip:9196@conference.freeswitch.or

2009-06-04 13:24:57 [NOTICE] switch_channel.c:602 switch_channel_set_name() New Channel portaudio/sip:9196@conference.freeswitch.org [77d54b4c-d395-af49-8950-2fe99635a0be]
Pa_StartStream: waveInStart returned = 0x0.
2009-06-04 13:24:58 [NOTICE] mod_PortAudio.c:1773 place_call() Channel [portaudio/sip:9196@conference.freeswitch.org] has been answered
API CALL [pa(call sip:9196@conference.freeswitch.org)] output:
SUCCESS:4:77d54b4c-d395-af49-8950-2fe99635a0be
2009-06-04 13:24:58 [INFO] mod_dialplan_xml.c:252 dialplan_hunt() Processing FreeSWITCH->sip:9196@conference.freeswitch.org in context default
2009-06-04 13:24:58 [NOTICE] switch_channel.c:602 switch_channel_set_name() New Channel sofia/internal/9196@conference.freeswitch.org [b34bd3c1-11ba-c54c-a518-4ca11f756726]
2009-06-04 13:24:58 [NOTICE] sofia.c:3605 sofia_handle_sip_i_state() Channel [sofia/internal/9196@conference.freeswitch.org] has been answered

在此时你应该可以听见自己的回声。如果没有听到则需要检查网络配置。

下一步挂断电话:

freeswitch> pa hangup

2009-06-04 13:25:07 [NOTICE] mod_PortAudio.c:1549 hangup_call() Hangup portaudio/sip:9196@conference.freeswitch.org [CS_EXECUTE] [NORMAL_CLEARING]
API CALL [pa(hangup)] output:
OK
2009-06-04 13:25:07 [NOTICE] switch_ivr_bridge.c:505 audio_bridge_on_exchange_media() Hangup sofia/internal/9196@conference.freeswitch.org [CS_EXCHANGE_MEDIA] [
NORMAL_CLEARING]
2009-06-04 13:25:07 [NOTICE] switch_core_session.c:1085 switch_core_session_thread() Session 7 (sofia/internal/9196@conference.freeswitch.org) Ended
2009-06-04 13:25:07 [NOTICE] switch_core_session.c:1087 switch_core_session_thread() Close Channel sofia/internal/9196@conference.freeswitch.org [CS_DESTROY]
WinMME StopStream: waiting for background thread.
2009-06-04 13:25:08 [NOTICE] switch_core_session.c:1085 switch_core_session_thread() Session 6 (portaudio/sip:9196@conference.freeswitch.org) Ended
2009-06-04 13:25:08 [NOTICE] switch_core_session.c:1087 switch_core_session_thread() Close Channel portaudio/sip:9196@conference.freeswitch.org [CS_DESTROY]

恭喜!如果你看到上面的输出信息,证明你已经摆脱了其他人正在忍受的 NAT 噩梦。

Making A Test Call and bridging to a SIP phone

下面的测试将会呼叫会议,并拨打位于默认域中用户 105 的 sip 电话,命令如下:

originate sofia/internal/9996@conference.freeswitch.org &bridge(user/105@default)

双 NAT 测试

1 )双 NAT 场景主要表现在两个电话 endpoints 都位于它们各自的 NAT 设备之后。两个 FreeSWITCH 服务器各自都位于 UPnP/NAT-PMP 之后,如下所示:

FS1 <> NAT <> Internet <> NAT <> FS2

在这种情况下 FreeSWITCH 的自动穿透机制就派上了用场。像上面一样配置 FreeSWITCH ,然后分别将 FreeSWITCH 服务器注册到另一个服务器上。


2 )使用 eyebeam/snom 的双 nat 网络,如下:

Eyebeam/snom1 <> NAT <> Internet <> NAT <> FS

Eyebeam/snom2 <> Internet <> NAT <> FS

两个客户端使用两个方式进行语音通话。 snom1 可以拨打 snom2, 反之亦然。发现这种一种现象:软电话收到“ BYE” 消息后挂断, FS 给的原因是“ ACK timeout” (确认超时),尽管此时 FS 已经接收到“ ACK” 消息(此时仍有语音流,所以不应该是 RTP 超时)。不确定是否因为安装步骤错误导致的这个问题。一旦确定是该问题将立即升级。 Eyebeam 同时也开启了 stun 服务。 FS 的 stun 不可用, autonat 可用。路由器是 netgear FVS318 无线路由器。 Snom 320 也存在同样问题。

Troubleshooting

<stub>

Upnp 部分 :

  • 带有 autonat 功能的 FS 在启动时会开启 SIP 端口,同时也会动态的开启 RTP 端口。

  • 路由器必须支持 upnp 。有一些路由器,如 FVS318 无线路由器,会被类似于 FS 的 upnp 设备在路由器上创建一张 upnp 端口映射表。通过该方式可以检验端口是否被正常的开启。

  • 对于 FS 端,可以在 FS 的命令行中输入 “nat_map add 1234 udp” ,检查路由器上的端口是否被开启。如果路由器有显示 upnp 端口映射表的功能最好,否则可以使用命令“ nat_map add 1234 tcp” ,然后从外网 telnet 1234 端口,检查端口是否开启。

( 在测试完上面的命令后,可以使用命令 “delete” 代替“ add” ,手工的删除端口。如 nat_map delete 1234 tcp ).

  • 对于 FS 日志,可以检查 debug 模式下的日志。当通话正在进行中时,查看是否有 switch_nat_add_mapping_upnp() 用于增加端口, switch_nat_del_mapping_upnp() 用于删除端口。

  • 使用源代码中的测试程序 miniupnpc 。进入 libs/miniupnpc 目录,输入 make 进行编译,将会产生一个名为 “upnpc-static” 的文件。使用 “-l” 选项列出现存的端口映射。同样,你也可以在网关设备上新建或删除映射的端口条目。

  • 从 download.com 网站上下载工具 “UPnP port works” 。使用这个工具可以查看端口列表,新增、删除端口。使用该工具检查路由器上的 UPnP 是否可用。(有时无法正常使用,但是只要先运行 BaUPnP ,再来使用的话则一切正常)。 该工具甚至可以用于转发 sip 端口,不过需要注意的是最终的目的是要 FS 可以正常的增删端口,不是端口转发。并且不能用来转发 RTP 端口,转发后也听不到声音。

  • 使用 tcpdump 和 wireshark 抓取 UPnP 或 NAT-PMP 的数据包。 UPnP 的过滤字符串是“ host 239.255.255.250” 。 NAT-PMP 的过滤字符串是“ host 224.0.0.1” 。

总之 :

  • 在开始点对点通话前,先进行回声测试。测试失败了,就先解决回声的问题。

Issues with FS UPnP

  • I have found that “UPnP port works” s/w was able to add / remove ports to the FS ip, but the nat_map command in the console did not. Please post similar experiences here and report to have them fixed.

支持 FS UPNP 设备列表

  • Linksys WRTxxx with dd-wrt or tomato firmware. dd-wrt version v24sp1 works functionally, but the UPNP UI page is always empty.

  • Linksys WRT54GL with dd-wrt v24-sp2 10/10/09 std -or- v24 preSP2[Beta] Build 13064 (recommended) drops 5060 and 5080 tcp/upd mappings. The connections will be up for a minute or so, and then gone. (10/7/2010)

    • above is also true for DD-WRT v24-sp2 (08/07/10) std. Tried adjusting timeouts in Administration->Management->IP Filter Settings (adjust these for P2P) with no joy.

  • Tomato Version 1.28 on a wrt54gl works well (working for several weeks so far…).

  • Linksys WRT54g2 with linksys firmware works with FS, but unreliable. FS can’t open the ports sometimes. Please add your own experience.

  • AT&T Uverse Residential gateway (by 2Wire) supports NAT-PMP. I am unable to find a status page that shows current mappings.

  • Netgear FVS318 wireless supports upnp and shows a table of portmappings. Worked with FS autonat.

  • Dlink DIR 655 wireless supports upnp, its “status”->”Internet sessions” shows “Local-NAT-Internet” port mappings. Please disable its “SIP ALG” feature under “Advanced”->”Firewall Settings”->”Application Level Gateway (ALG) Configuration”, otherwise the SIP gateway registrations are not stable.

Note firmware 1.2.1 has UPNP bug, its UPNP function working for a while until after a couple of hours stopping work properly. new firmware 1.3.2NA seems to have corrected the UPNP bug per its claim, still keeping watching it on my DIR655.

DLINK DIR 655’s UPNP is not stable even with firmware 1.3.2NA, not recommended for production use.

  • Blanc Wireless G router BW54R11 Firmware 1.4.1 UPNP feature worked with FS auto-nat.

  • Netgear wgt624 is a really bad router. Please stay away from it !

  • Mikrotik routers: PC-based and RouterBoards with RouterOS v.3.25. Previous versions not tested (maybe working all 3.xx branch)

  • Digicom wave 64 with firmware version: 2.11.62.2(RE0.C2D)3.10.16.0

支持自动穿透的 NAT-PMP 设备列表

  • Apple Airport Extreme with Firmware 7.4.2

Please update this wiki with list of routers as you test them

什么时候不使用穿透

FreeSwitch 搭建在公网,并且启动模式为“ nonat” 。就我所知, fs 仍针对那些位于 nat 设备后面的 ip 电话使用 nat 。(不是百分之百确定)。

转:Freeswitch with mod_flite / mod_perl (

11.27.2012, 转:Freeswitch with mod_flite / mod_perl (已关闭评论, freeswitch, by .

转自:http://blog.sina.com.cn/s/blog_971194760100yde6.html

mod_say只能唸出數字,所以前幾天試了一下mod_flite,感覺還不錯,Flite是TTS(Text To Speech)的一種,有四種發音,目前Freeswitch提供的只有英文發音,如果需要中文的,可能要花點工夫。

slt (female voice) <– 有氣無力,聽起來要死不活;
rms (male voice) <– 像國中時代用的電子字典;
awb (male voice) <– 這個發音稍微清楚點,所以我用這個;
kal (male voice) <– 語音速度太快,用不了(沒找到可以控制語音速度的參數)。

按Wiki上的說明,可以在Dial Plan的分機中引用設定tts為flite,然後再指定發音,如Kal

<extension name=”flite”>
<condition field=”destination_number” expression=”^9886$”>
<action application=”set” data=”tts_engine=flite”/>
<action application=”set” data=”tts_voice=awb”/>
<action application=”speak” data=”This is flite on FreeSWITCH”/>
</condition>
</extension>

但在實際的應用當中,我們可以用Script來讓它活用起來,Script可以是Javascript,也可以是官方推薦的Lua,但個人習慣且較熟悉Perl,所以用Perl來寫一段身份驗證代碼:

#!/usr/bin/perl -w
our $session;
@white_list = (“addison”, “1001”, “1003”, “linsane”);

$user_name = $session->getVariable(“caller_id_number”);
$session->set_tts_parms(flite, awb);

if (grep(/^$user_name$/,@white_list))
{
$session->speak(“Welcome! $user_name. This is flite on FreeSWITCH”);
}
else
{

$session->hangup;

}
return 1;

這時候就可以在需要用到的地方加入

<action application=”perl” data=”/scripts/flite.pl”/>

說到活用? 這個能做什麼呢?

1.寫一個自動抓取新聞的程式,在每天早上上班途中(如果是開車),讓它在週一到週五8:30AM自動呼叫你的手機,然後把新聞唸給你聽,當然你最好跟我一樣已經把GSM或CDMA語音卡整合起來,並且確定已申請過網內互打免費的套餐;

2.整合到Nagios網路監控系統,讓你的Nagios不僅能夠發簡訊,也可以用電話呼叫你,並且依照自己設定好的語句,把故障的機器用語音報給你(開車看簡訊還是相對危險的);

3.其它可以想到需要電話語音的,都可以利用TTS這樣的系統結合起來…

转:FreeSwitch中配置网关的方法

11.27.2012, 转:FreeSwitch中配置网关的方法已关闭评论, freeswitch, by .

在VOIP通信系统中,经常要用到网关。那么网关怎么和FreeSwitch在一起配合使用?

有如下需求:

有一虚拟运营商(即:SIP PROVIDER ),提供拨打外线的功能。从该处购买一 SIP 账号,具体配置信息如下:

用户名:user

密码:   pass

服务器IP:100. 100.100.100

想通过和该SIP PROVIDER 对接实现拨打外线功能。即:0+要拨打的号码,就送到该SIP PROVIER (说明:此时的 SIP PROVIDER 相当于一网关)。

解决方法:

(1)添加一个网关

      在 \conf\sip_profiles\external 中添加一个名为GW_TEST.xml 的文件,内容如下:

      <gateway name=”GW_TEST”>
           <param name=”realm” value=”100. 100.100.100″/>
           <param name=”username” value=”user”/>
           <param name=”password” value=”pass”/>
      </gateway>

(2) 新建一个拨码计划

        在 \conf\dialplan\default 中新建一个名为 call_gw_test.xml 的文件 ,内容如下:

        <include>
            <extension name=”call out”>
            <condition field=”destination_number” expression=”^0(\d+)$”>
                <action application=”bridge” data=”sofia/gateway/GW_TEST/$1″/>
            </condition>
            </extension>
         </include>

(3) 通过 FS_CLI.exe 运行 reloadxml ,即可生效。

转:FreeSwitch中的音乐保持功能

11.27.2012, 转:FreeSwitch中的音乐保持功能已关闭评论, freeswitch, by .

Music on hold(MOH) ,即:音乐保持,在一般电话系统中都存在。FreeSwitch也支持该功能,并且保持音乐可配置。

FreeSwitch默认的配置中,用户通过某IP话机拨打 9664 ,呼叫建立后,就可以听到保持音乐。

查看当前系统中音乐文件的路径,可以通过 FS _CLI.EXE 运行 show_local_stream 来显示。

如果你想修改默认的保持音乐,可以自己添加一些好听的音乐进来,方法如下:

(1)在 \sounds\music 新建一个文件夹 MOH_TEST,并拷贝音乐文件进去(WAV文件);

(2)在 \conf\autoload_configs\local_stream.conf.xml 中添加如下内容,

                  <directory name=”moh_test” path=”$${sounds_dir}/music/MOH_TEST”>
                    <param name=”rate” value=”8000″/>
                    <param name=”shuffle” value=”true”/>
                    <param name=”channels” value=”1″/>
                    <param name=”interval” value=”20″/>
                    <param name=”timer-name” value=”soft”/>
                  </directory>

(3)  在  \conf\vars.xml 中添加如下内容,

                 <X-PRE-PROCESS cmd=”set” data=”moh_test=local_stream://MOH_TEST”/>

(4) 在 \conf\dialplan\default 中添加一个名为 moh_test_call.xml 的文件,内容如下:

                <include>
                  <extension name=”moh_test_call”>
                    <condition field=”destination_number” expression=”^96646$”/>
                       <action application”playback” data=”${moh_test}”/>
                    </condition>
                  </extension>
                 </include>

(5)改变了默认的音乐文件后,需要重新加载  mod_local_stream 模块,在 FS_CLI.exe 中运行 reload mod_local_stream 即可生效。

(6)在 FS_CLI.EXE 中运行 reloadxml 或 按F6,即可生效。

 

通过某一IP 话机拨打 96646 后,即可听到你自己设置的保持音乐。

转:FreeSwitch的录音功能

11.27.2012, 转:FreeSwitch的录音功能已关闭评论, freeswitch, by .

               一般电话系统都可以将本系统内的语音通话录制下来,FreeSwitch 系统中也可以进行语音录制。

               需求:

                       录制系统中的所有通话。

               实现:

             (1)建立一个文件夹 freeswitch/recordings/archive/ ,用来存储录音文件;

             (2)修改拨码计划,打开 \conf\dialplan\default.xml

                     找到下面的语句:

                     <extension name=”Local_Extension”>    

                           <condition field=”destination_number” expression=”^(10[01][0-8])$”>

                      在其下,添加:

                      <action application=”set” data=”RECORD_TITLE=Recording ${destination_number} ${caller_id_number} ${strftime(%Y-%m-%d %H:%M)}”/>  

                      <action application=”set” data=”RECORD_COPYRIGHT=(c) 2011″/>  

                      <action application=”set” data=”RECORD_SOFTWARE=FreeSWITCH”/>

                      <action application=”set” data=”RECORD_ARTIST=FreeSWITCH”/> 

                      <action application=”set” data=”RECORD_COMMENT=FreeSWITCH”/> 

                      <action application=”set” data=”RECORD_DATE=${strftime(%Y-%m-%d %H:%M)}”/>  

                      <action application=”set” data=”RECORD_STEREO=true”/>

     <action application=”record_session” data=”$${base_dir}/recordings/archive/${strftime(%Y-%m-%d-%H-%M-%S)}_${destination_number}_${caller_id_number}.wav”/>

             (3)在 FS_CLI.EXE 中运行 reloadxml 或 按 F6 即可生效。

                查询 FreeSwitch 支持的音频文件格式,可以在 FS_CLI.exe 中运行 show file 命令。

转:FreeSwitch播放语音文件

11.27.2012, 转:FreeSwitch播放语音文件已关闭评论, freeswitch, by .

通过 FreeSwitch ,是否可以直接播放语音文件?

FreeSwitch 中有一个 playback  的 application ,可以播放语音文件。

具体用法如下:

(1)播放本地文件

       <action application=”set” data=”playback_terminators=none”/>

       <action application=”playback” data=”sounds/soundfile.wav”/>  

(2)播放远程服务器上的文件

       <action application=”playback” data=”${http_get(http://myserver.yo/media/hello_world.wav)}“/>

转:FreeSwitch中的录像功能和播放录像功能

11.27.2012, 转:FreeSwitch中的录像功能和播放录像功能已关闭评论, freeswitch, by .

          FreeSwitch 系统中的录像功能 和 播放录像功能,系统都默认提供。

          按默认配置,通过IP电话拨打9193,即可录像;通过IP电话拨打9194即可播放录像。

          同时,我测试了一种有趣的用法,描述如下:

         (1) 1000  呼叫 9193 并且发送视频;

         (2) 1001 呼叫 9194 ,可以看到 1000 上传的视频,但非实时;

         (3) 1002 呼叫 9194, 可以看到 1000 上传的视频,但非实时。

           这样看来,一个点播系统,FreeSwitch 默认就支持!稍加改造,就可以变为一套视频直播系统。

           实现上述功能的配置文件在 \conf\dialplan\default.xml 中,如下所示:

[录像]

           <extension name=”video_record”>
             <condition field=”destination_number” expression=”^9193$”>
                 <action application=”answer”/>
                 <action application=”record_fsv” data=”/tmp/testrecord.fsv”/>
             </condition>
           </extension>

  [播放录像]

           <extension name=”video_playback”>
              <condition field=”destination_number” expression=”^9194$”>
                   <action application=”answer”/>
                   <action application=”play_fsv” data=”/tmp/testrecord.fsv”/>
               </condition>
           </extension>

转:FreeSwitch之模块类型

11.27.2012, 转:FreeSwitch之模块类型已关闭评论, freeswitch, by .

声明:本文转载自 http://www.cnblogs.com/spiritonly/articles/1790859.html

       FreeSWITCH的内核特别稳定,而外部模块的接口也相当稳定,所以为我们开发自己的模块打下了良好的基础。在设计之初,Anthony Minessale 将外部模块分为13中类型,每种类型代表不同的应用方向,并且也设计了稳定的plugin接口。

       FreeSWTICH的接口类型:

  1. SWITCH_ENDPOINT_INTERFACE /* endpoint modules, 主要实现各种通信协议,如SIP、H.232、Skype、XMPP等等*/
  2. SWITCH_TIMER_INTERFACE /* 时钟接口,包括软时钟和硬时钟,FreeSWITCH自带一个soft timer */
  3. SWITCH_DIALPLAN_INTERFACE /* dialplan modules, 用来控制呼叫流程的,比如在XML中编写流程的控制,或者自己定义一种文本语法,然后编写一个dialplan module用来解析这种流程控制的语法 */
  4. SWITCH_CODEC_INTERFACE /* 编码模块,包括 G.722、G.729等,现在貌似还没有视频的编解码,有兴趣的朋友可以自己开发一个 */
  5. SWITCH_APPLICATION_INTERFACE /* 应用模块,这种模块一般是用户定义的功能,比如说使用自己的短信猫发短信,那么就可以写一个APP,在dialplan中使用 */
  6. SWITCH_API_INTERFACE /* API一般是在FreeSWITCH的shell中使用的,但是也可以通过特定方式在dialplan中使用,类似于APP modules */
  7. SWITCH_FILE_INTERFACE /* 文件操作模块,暂时还没分析这个接口 */
  8. SWITCH_SPEECH_INTERFACE /* TTS 模块,调用TTS引擎的API实现语音合成的功能,用户可以直接在dialplan中使用,比如将微软的SAPI实现TTS功能 */
  9. SWITCH_DIRECTORY_INTERFACE /* 模块操作模块,暂时还没分析这个接口 */
  10. SWITCH_CHAT_INTERFACE /* IM模块,暂时还没分析这个接口 */
  11. SWITCH_SAY_INTERFACE /* 提示音多语言支持模块,FreeSWTICH有一些内置的提示音,一个say module实现一种语音的提示音播放,比如说mod_say_zh就是使用中文播放 “元”、”角”、“分”,而mod_say_en就是英文播放”dollar“、”cent“等 */
  12. SWITCH_ASR_INTERFACE /* ASR模块,调用语音识别引擎API实现语音识别 */
  13. SWITCH_MANAGEMENT_INTERFACE /* 暂时还没有分析这个接口 */

  上面这些接口,有的比较简单,比如TTS的,SAY模块(大部分常用的都内置了,无需再开发),Dialplan模块,也有部分比较复杂,比如Endpoint和ASR这两个就教负责一些。还有一些我还没有分析到,所以不太清楚其负责程度,等写到对应的模块再说吧。

其实说白了,C/C++的plugin/module framework无非就是函数指针,那么FreeSWITCH的module接口也是大量的使用了函数指针,以达到用户实现功能模块,FreeSWITCH Core负责调度的原则。

  基本上会按照上面标志的顺序对FreeSWITCH的模块开发做一些简单的分析,然后再说一下开发中应该注意的地方(如果我做过对应模块),最后可能写一些简单的示例。

转:FreeSwitch中的会议功能

11.27.2012, 转:FreeSwitch中的会议功能已关闭评论, freeswitch, by .

           FreeSwitch 默认支持会议功能,有如下特点:

          (1) 不需要创建一个会议室的操作,只需要通过 conference 拨码计划就可以实现;

          (2) 会议室不真正存在, 直到有人呼入为止;

          (3) 会议功能很强大,能实现灵活控制。

            这样讲太学术化,来点直观的,步骤如下:

          (1) 运行 FREESWITCH 服务器程序;

          (2) 注册 1000、1001、1002三部IP话机;

          (3) 通过 1000 呼叫 3000,通话建立后, 1000 将听到一段保持音乐;

          (4) 通过 1001 呼叫 3000,通话建立后, 1001将能听到1000的声音,1000也能听到1001的声音;

          (5) 通过 1002 呼叫 3000,通话建立后,  1002将能听到 1000 和 1001的声音,1001能听到1000和1002的声音,1000也能听到 1001 和 1002 的声音。

            那 3000 这个号码是怎么来的? 请看 \conf\dialplan\default.xml 中的内容,如下所示:

             <!–
                   start a dynamic conference with the settings of the “default” conference profile in conference.conf.xml

                   使用 conference.conf.xml 中定义的属性进行如下会议
             –>                                                                                                                                                      
            <extension name=”nb_conferences”>
                <condition field=”destination_number” expression=”^(30\d{2})$”>
                   <action application=”answer”/>
                   <action application=”conference” data=”$1-${domain_name}@default”/>
                </condition>
             </extension>

 

            FreeSwitch 提供了一些控制会议成员行为的方法,罗列如下:

          (1)Talk volume: The volume of the audio the caller sends (that is, gain control).

                   与会成员讲话的音量控制;

          (2)Listen volume: The volume of the audio the caller hears.

                   与会成员收听语音的音量控制;

          (3)Energy threshold: The minimum energy level of the audio from the caller to be considered talking. Raising the energy level will cut down on background noise when
                   a participant is in a noisy environment.

                   语音门限控制 。

            具体用法,可以查看:\conf\autoload_configs\console.conf.xml ,内容如下:

             <caller-controls>
                 <group name=”default”>
                   <control action=”mute” digits=”0″/>             // 静音
                   <control action=”deaf mute” digits=”*”/>      // 解除静音
                   <control action=”energy up” digits=”9″/>     // 增加门限
                   <control action=”energy equ” digits=”8″/>   //
                   <control action=”energy dn” digits=”7″/>     // 降低门限
                   <control action=”vol talk up” digits=”3″/>     // 提高讲话音量
                   <control action=”vol talk zero” digits=”2″/>  // 讲话音量设置为0
                   <control action=”vol talk dn” digits=”1″/>     // 降低讲话音量
                   <control action=”vol listen up” digits=”6″/>  // 提高收听音量
                   <control action=”vol listen zero” digits=”5″/> // 收听音量设置为0
                   <control action=”vol listen dn” digits=”4″/>    // 降低收听音量
                   <control action=”hangup” digits=”#”/>           // 退出会议
               </group>
            </caller-controls>

 

        FreeSwitch中可以设置主持人以及会议密码。设置了主持人后,可以影响会议的开展;设置了会议密码后,与会成员必须输入正确密码才能入会。

        主持人对会议的影响主要体现在以下两个方面:

      (1)直到主持人入会后,会议才开始;

      (2)主持人退出会议后,会议才结束。

        那怎么设置主持人?方法如下:

        <action application=”conference” data=”$1@default”/> // 未设置主持人
        <action application=”conference” data=”$1@default+flags{moderator}”/> // 设置了主持人

        如何设置会议密码?方法如下:

        <action application=”conference” data=”$1@default+1234″/> // 设置入会密码为 1234

        如何既设置主持人,又设置会议密码?方法如下:

       <action application=”conference” data=”$1@default+1234+flags{moderator}”/>

 

               FreeSwitch 是否支持视频会议?答案是 支持的!

               FreeSwitch 默认只支持与会成员看到当前“嗓门最大”的那个人的视频。

               在实际应用中,当讲话人改变时,视频会切换,但切换的时候,视频会有马赛克现象。此问题期待高手解决!

               场景描述如下:

               三个用户 1000、1001、1002 都注册到同一台服务器。

             (1)1000 呼叫 3000,进入会议,同时发送自己的视频,1000 可以看到自己;

             (2)1001 呼叫 3000,进入会议,可以看到 1000 的视频。若1001也发送自己的视频,双方看到的视频是当前讲话声音大的一方的视频;

             (3)1002 呼叫 3000,进入会议,可以看到当前讲话一方的视频。若 1002 也发送自己的视频,三方看到的视频是当前讲话声音大的一方的视频。

               再扩展下思维,能否让 FreeSwitch 实现融屏功能,实现与会各方都能彼此看到自己!那FreeSwitch就更强大了。以下是几个相关的资源简介:

             (1)BigBluebutton 这个视频会议项目中用到了 FreeSwitch, 项目主页:  http://www.bigbluebutton.org/ 。但对视频的处理只是转发各路视频,没有实现融屏合成一路视频推送到各方显示。

             (2)openvcs 是一个开源的 SIP MCU 实现,项目主页:http://code.google.com/p/openvcs/ 。 在 Windows 下实现了融屏的原型设计,但在效率以及并发处理方面,还有许多需要完善的地方。但提供了一个开发 SIP MCU 的思路,这个是很有价值的。

 

 

        邀请手机用户或座机用户入会: 在 FS_CLI.EXE 中运行 类似 conference <conf-id> dial Sofia/gateway/xyz/1234567890 即可。

转:freeswitch对接asterisk案例

11.27.2012, 转:freeswitch对接asterisk案例已关闭评论, freeswitch, by .

说明:转载至 – http://www.91asterisk.com/thread-438-1-1.html   版权归原作者所有!

重点说明freeswitch的配置
我们假设asterisk的IP为210.134.185.9,有个sip号码为60006
1、asterisk配置
     修改sip.conf,添加如下内容:
[fs]
username=fs
secret=123
host=dynamic
type=peer
nat=yes
context=from-internal
2、配置domain
修改freeswitch安装目录下conf/drectory/default.xml,添加如下内容:
<domain name=”210.134.185.9″>
     <params>
      <param name=”dial-string” value=”{presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}”/>
    </params>
    <variables>
      <variable name=”record_stereo” value=”true”/>
      <variable name=”default_areacode” value=”$${default_areacode}”/>
      <variable name=”transfer_fallback_extension” value=”operator”/>
    </variables>
     <user id=”210.134.185.9″>
         <gateways>
            <X-PRE-PROCESS cmd=”include” data=”gateway/*.xml”/>
         </gateways>
     </user>
< /domain>
3、配置网关(gateway)
在freeswtich的conf/directory/目录下新建文件夹gateway,在gateway文件夹下新建一个xml文件,内容如下:
<include>
< gateway name=”asterisk”>
    <param name=”username” value=”fs”/>
    <param name=”password” value=”123″/>
    <param name=”realm” value=”210.134.185.9″/>
    <param name=”from-domain” value=”210.134.185.9″/>
    <param name=”expire-seconds” value=”600″/>
    <param name=”register” value=”false”/>
< /gateway>
< /include>
4、配置呼叫规则
修改freeswtich安装目录下的conf/dialplan/default.xml,添加内容如下:
<extension name=”extension-asterisk”>
      <condition field=”destination_number” expression=”^(6[01][01][0-9][0-9])$”>
          <action application=”set” data=”dialed_extension=$1″/>
          <action application=”bridge” data=”sofia/gateway/asterisk/$1″/>
      </condition>
< /extension>
配置完毕,启动freeswitch即可进行呼叫
注意:
如果freeswitch和asterisk都在内网,请修改freeswtich安装目录下的conf/sip_profiles下的external.xml,如下,原来为:
<param name=”ext-rtp-ip” value=”$${external_rtp_ip}”/>
< param name=”ext-sip-ip” value=”$${external_sip_ip}”/>
修改为:
<param name=”ext-rtp-ip” value=”$${local_ip_v4}”/>
< param name=”ext-sip-ip” value=”$${local_ip_v4}”/>重点说明freeswitch的配置
我们假设asterisk的IP为210.134.185.9,有个sip号码为60006
1、asterisk配置
     修改sip.conf,添加如下内容:
[fs]
username=fs
secret=123
host=dynamic
type=peer
nat=yes
context=from-internal
2、配置domain
修改freeswitch安装目录下conf/drectory/default.xml,添加如下内容:
<domain name=”210.134.185.9″>
     <params>
      <param name=”dial-string” value=”{presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}”/>
    </params>
    <variables>
      <variable name=”record_stereo” value=”true”/>
      <variable name=”default_areacode” value=”$${default_areacode}”/>
      <variable name=”transfer_fallback_extension” value=”operator”/>
    </variables>
     <user id=”210.134.185.9″>
         <gateways>
            <X-PRE-PROCESS cmd=”include” data=”gateway/*.xml”/>
         </gateways>
     </user>
< /domain>
3、配置网关(gateway)
在freeswtich的conf/directory/目录下新建文件夹gateway,在gateway文件夹下新建一个xml文件,内容如下:
<include>
< gateway name=”asterisk”>
    <param name=”username” value=”fs”/>
    <param name=”password” value=”123″/>
    <param name=”realm” value=”210.134.185.9″/>
    <param name=”from-domain” value=”210.134.185.9″/>
    <param name=”expire-seconds” value=”600″/>
    <param name=”register” value=”false”/>
< /gateway>
< /include>
4、配置呼叫规则
修改freeswtich安装目录下的conf/dialplan/default.xml,添加内容如下:
<extension name=”extension-asterisk”>
      <condition field=”destination_number” expression=”^(6[01][01][0-9][0-9])$”>
          <action application=”set” data=”dialed_extension=$1″/>
          <action application=”bridge” data=”sofia/gateway/asterisk/$1″/>
      </condition>
< /extension>
配置完毕,启动freeswitch即可进行呼叫
注意:
如果freeswitch和asterisk都在内网,请修改freeswtich安装目录下的conf/sip_profiles下的external.xml,如下,原来为:
<param name=”ext-rtp-ip” value=”$${external_rtp_ip}”/>
< param name=”ext-sip-ip” value=”$${external_sip_ip}”/>
修改为:
<param name=”ext-rtp-ip” value=”$${local_ip_v4}”/>
< param name=”ext-sip-ip” value=”$${local_ip_v4}”/>