吴伟贤のBlog

Feed Rss

freeswitch cookbook 第五章(三) 使用短语宏创建声音提示

07.20.2013, freeswitch cookbook 第五章(三) 使用短语宏创建声音提示已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/76.html

 

Using phrase macros to build sound prompts 
使用短语宏创建声音提示

使用中我们经常而且很有必要拼接一些小的声音文件成一个大的声音文件. FreeSWITCH的短语宏系统就是一个非常强大工具, 不仅能拼接小的声音文件, 还可以添加一些逻辑处理,所以你的短语就不仅仅是一些独立文件的拼接.

Getting ready

本小方法中你至少需要一个文本编辑器和一个SIP电话.此外,还建议你看看你的语言短语文件. 英文的phrase文件就在源码目录docs/phrase/phrase_en.xml. phrase_en.xml文件前面是文件名, 后面就是它的文字描述. 提示音分成了不同的小章节如voicemail, IVR, currency, digits,和time. 目前最大的提示音列表就是IVR了.

在本方法中我们会建立一个可以播放主叫的分机号码的简单拨号方案,我们会使用phrase macro 来处理连接提示音的工作, 然后利用say 应用来读出主叫的分机号码.

How to do it…

开始添加extension到dialplan:
1. 创建或编辑文件conf/dialplan/default/01_Custom.xml
2. 添加以下行:

<extension name="who's calling">
  <condition field="destination_number" expression="^(1500)$">
    <action application="answer"/>
    <action application="playback"
            data="phrase:whoami:${username}"/>
    <action application="hangup"/>
  </condition>
</extension>

3. 保存文件退出

然后, 创建phrase macro:
1. 创建或编辑文件 conf/lang/en/ivr/custom.xml.
2. 添加以下行:

<macro name="whoami">
  <input pattern="^(\d+)$">
    <match>
      <action function="play-file"
              data="ivr/ivr-extension_number.wav"/>
      <action function="sleep" 
              data="100"/> 
      <action function="say" 
              data="$1" 
              method="pronounced" 
              type="number"/> 
    </match> 
    <nomatch> 
      <action function="play-file" 
              data="ivr/ivr-that_was_an_invalid_entry.wav"/> 
    </nomatch> 
  </input> 
</macro>

3. 保存文件退出
4. 在fs_cli控制台中执行reloadxml或按F6.

拨打1500测试新的extension.

How it works…
此操作的关键就是我们创建的dialplan extension中的这一行:

<action application="playback" data="phrase:whoami:${username}"/>

一般情况下playback应用都是传入一个文件名作参数. 不过, 如果参数以phrase:开头, 它就会查找短语宏而不是声音文件了. 在示例中, 我们调用了一个名叫whoami的宏, 同时给它传了一个参数${username}, 这个参数包含着中叫用户的ID号码.此时短语宏whoami就获得了控制.

传到macro中的参数在这一行得到了处理.

<input pattern="^(\d+)$">

输入的值会用来匹配pattern选项中的正则表达式. 大多数情况下${username}只包含数字,
我们把它匹配的值保存到了特殊的变量$1中. 此时,我们现在有一点点的逻辑,以帮助决定该怎么做。
如果输入的值匹配, 那么<match>对象中的actions被会执行. 如果输入的值不匹配, 那么<nomatch>对象中的action会被执行(极少数情况下非用户拨打了1500, 我们仅播放一个提醒, 您的输入不正确(That was an invalid entry)).

你可能已经想象出现在match或nomatch中的actions会被顺序执行.你也可以看到短语宏不仅仅局限于播放独立的声音文件. 你可以调用函数sleep和say来自定义向用户播放声音提醒的方式. 如果你装了一个TTS应用, 你也可以在宏中调用.

There’s more…

使用短语宏可以执行很多不同的操作.事实上, FreeSWITCH的语音邮件系统就大规模的使用了宏. 浏览conf/lang/en/vm/sounds.xml可以看到mod_voicemail模块用到的所有宏.
记住你可以使用sounds.xml文件中的任意一个宏只要你调用它们时传的参数正确.

有一个特别有用的短语宏叫voicemail_record_file_check. 想象一种情况,你需要主叫去录下一段声音. 也许你有一个自定义的应用,主叫需要录下一段声音. 这个宏允许你拥有一个自定义的phrase说一些这样的话”按1收听, 按2保存, 按3重新录制”. 举个例子,你可以使用play_and_get_digits去告诉用户怎么做:

<action application="play_and_get_digits" data="1 1 3 4000 # 
phrase:voicemail_record_file_check:1:2:3 ivr/ivr-invalid_entry.wav 
selection \d"/>

上面的action会准确地告诉主叫, “按1收听录音, 按2保存录音, 按3重新录制”. 它会把输入保存到变量${selection}中. 注意这个宏中提醒给主叫的声音是可以定制的.使用参数phrase:voicemail_record_file_check:4:5:6 调用宏时会告诉主叫”按4收听录音,按5保存录音,按6重新录制”.

学习phrase macros的一个好的学习方法就是呼叫语音邮件时观察控制台. 你可以实时地看到FreeSWITCH分析phrase macros和执行包含在内部的action.

See also
> 参考本章后面提到的  mod_flite模块和基础TTS 和 mod_tts_commanline模块和高级TTS

FreeSWITCH Cookbook 第五章(二) Company directory 企业目录

07.20.2013, FreeSWITCH Cookbook 第五章(二) Company directory 企业目录已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/42.html

Company directory  企业目录

大多数企业,不管什么格式,都有通过姓名来拨打电话的企业通讯录. 本小方法就告诉你怎么通过使用模块mod_directory为你已经安装好的FS添加企业通讯录.

How to do it…

通过以下步骤, 开启和编译mod_directory
1. 使用文本编辑器打开freeswitch_src/modules.conf.
2. 取消以下行的注释
#applications/mod_directory
3. 保存文件退出
4. Linux/unix用户执行make命令:
make mod_directory-install

允许FreeSWITCH启动时模块mod_directory自动加载:

1. 使用文件编辑器打开文件conf/autoload_configs/modules.conf.xml
2. 取消以下行的注释
<!–<load module=”mod_directory”/>–>
3. 保存文件退出
4. 重启Freeswitch

5. 打开fs_cli, 然后执行命令去显示application.(tab键)

在应用列表中你应该能看到directory. 下面我们添加一个允许我们测试的简单的拨号extension:

1. 使用文件编辑器打开文件conf/dialplan/default/01_Custom.xml
2. 添加以下行
<extension name=”dial by name”>
<condition field=”destination_number” expression=”^(1411)$”>
<action application=”directory” data=”default ${domain}”/>
</condition>
</extension>
3. 保存文件退出

最后一件事是要确保至少directory中有一个用户有directory_full_name 或 effective_caller_id_name 变量. 现在我们要设置1000号码的directory_full_name:

1. 使用文件编辑器打开conf/directory/default/1000.xml
2. 添加以下行到<variables> section:
<variable name=”directory_full_name” value=”Ada Lovelace”/>
3. 保存文件和退出.在fs_cli控制台中按F6或执行reloadxml命令.

此时我就已经可以测试了.使用你的电话拨打1411和收听选项. 在本次测试中, 拨打last name的前三个首字母(568对应”L-O-V”)和收听结果.

How it works…

Directory应用从用户目录(user directory)中获取它需要的信息. 通过设置directory_full_name变量我们指定了用于搜索用户目录的姓名. 如果你想用effective_caller_id_name 变量也行.
effective_caller_id_name变量控制打用户拨打电话时的显示姓名. 如果有其他的原因这个变量不是姓名, 那就用directory_full_name, dial-by-name搜索时专门用来替换effective_caller_id_name.

在你的初始测试中大多数你不能听到有些说” Ada Lovelace”, 但能听到有人拼写出来这个名字. 当用户没有录下自己的姓名时mod_directory就这样处理. 如果你登录到语音邮件系统然后录制一个名字提醒(在VM主菜单中按选项5,然后再按选项3), 那么系统就不会拼写出你的名字而是播放你录制的.

There’s more…

每个用户有两个可以设置的变量来定制directory目录的行为:

Ø  directory-visible:
把这个变量设置为false可以阻止directory的搜索. 避免directory中包含”走廊电话”和”来宾电话”而造成混乱时这个功能就很有用了. 用于保证VIP分机不被包含进去也是很便捷的.

Ø  directory-exten-visible:
把这个变量设置为false可以阻止directory应用说出某个用户的分机号(一些环境中不希望把分机号码公开)

See also
Ø  Refer to the Accessing voicemail and Creating users recipes in this chapter

freeswitch-cookbook 第三章(三) Using a web server to handle XML CDRs

07.20.2013, freeswitch-cookbook 第三章(三) Using a web server to handle XML CDRs已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/41.html

Using a web server to handle XML CDRs

Freeswitch的mod_xml_cdr模块有个很好的功能,它可以把CDR使用HTTP POST到一个可以处理CDR或是把CDR插入到数据库的WEB服务器.
这个功能有几个优点:
1.现在的WEB服务器可以有很大的并发量
2.多个FreeSWITCH服务器可以都发送到一个WEB服务器
3.多个WEB服务器可以设置成允许备份和冗余.
本方法将会重点关注配置一个WEB SERVER用来处理带XML CDR的POST请求.
Getting ready
你需要一个你控制的可以使用的WEB SERVER.大多数Linux/Unix和windows都是可以安装Apache的.怎么配置一个WEB SERVER本书就不提了,此类内容的介绍在很多书中和互联网上都有.本方法将会假想已经有一个干净利索的Apache WEB服务器,但这些方法同样适用于其他的服务器,像Lighttpd and Nginx.本例子中我们假想apache和Freeswitch运行在同一台服务器上.
How to do it…
在你的服务器上启用mod_xml_cdr.(参数本章节中之前提到的 使用XML CDR方法).
下面, 请按照下列步骤操作:
1.打开conf/autoload_configs/xml_cdr.conf.xml然后定位到此行
<!– <param name=”url”  value=”http://localhost/cdr_curl/post.php”/> –>
2. 改变此行的内容 <param name=”url” value=”http://localhost/cgi-bin/cdr.pl”/>
3.保存退出
4.在您系统的cgi-bin目录下,创建一个名叫cdr.pl的文件(通常cgi-bin目录是/usr/lib/cgi-bin但在比较老的系统上可能不一样).
添加这些内容到文件中:

#!/usr/bin/perl
  use strict;
  use warnings;
  use CGI;
  $|++;
    my $q = CGI->new;
    my $raw_cdr = $q->param('cdr');
    open (FILEOUT,'>','/tmp/cdr.txt');
    print FILEOUT $raw_cdr;
  close(FILEOUT);
print $q->header();

5.保存文件退出
6.使用以下命令使文件可执行 chmod +x /usr/lib/cgi-bin/cdr.pl
7.进入fs_cli和按F6或执行reloadxml命令
8. 拨打一通测试电话,你应该可以看到/tmp/cdr.txt文件内容中含有XML CDR记录.
How it works…
这是一个简单的使用Perl写的CGI脚本.它的功能就是把mod_xml_cdr提交的POST数据的cdr参数值提取出来.一旦它有这个值(在变量$raw_cdr中)脚本就会把CDR信息输出到临时文件/tmp/cdr.txt中. 但这个例子在生产环境上就不是那以的有用了,它只是说明了得到POSTed的CDR数据并插入到系统中的最简单步骤.如果你更擅长其它的脚本语言,像PHP, Python,或Ruby,你可能很容易地使用这些语言来处理CDR.下面是一个使用PHP写的示例版本:

$raw_cdr = $_POST['cdr'];
  $writefile = fopen('/tmp/dump.txt',"w");
  fwrite($writefile, $raw_cdr);
fclose($writefile);

一旦你在程序中得到了数据,你处理它们的选项就多了.
There’s more…
使用CGI脚本处理XML CDR数据(Fast CGI或其它可以处理HTTP POST请求的有用的方法)的常用习惯就是处理数据然后插入到数据库中. 这面的部分就是描述怎么样把CDR插入到和前一个小方法Inserting CDRs into a backend database中使用的数据库和表中. 假设你一个”CDR”数据库,里面还有个”cdr”表,你可以使用下面的这个修正版本的cdr.pl脚本插入记录到数据库中. 你需要使用cspan工具去安装DBI和DBD模块去支持数据库.通用的是DBD::mysql和DBD::PgPP.示例是假设是DBD:PGPP,纯perl写的Postgres数据库驱动. The modifed cdr.pl is as follows: 修改版本的cdr.pl看起来像这样:

#!/usr/bin/perl

  use strict;
  use warnings;
  use CGI;
  use DBI;
  use Data::Dump qw(dump);
  $|++;
    my $q = CGI->new;
    my $raw_cdr = $q->param('cdr');
    my @all_fields = qw(caller_id_name caller_id_number 
    destination_number context start_stamp answer_stamp end_stamp 
    duration billsec hangup_cause uuid bleg_uuid \
    accountcode read_codec write_codec);
      my @fields;
      my @values;
      foreach my $field (@all_fields) {
        next unless $raw_cdr =~ m/$field>(.*?)</;
        push @fields, $field;
        push @values, "'" . urldecode($1) . "'";
      }
      my $cdr_line;
      my $query = sprintf(
      "INSERT INTO %s (%s) VALUES (%s);",
      'cdr', join(',', @fields), join(',', @values)
      );
    my $db = DBI->connect('DBI:PgPP:dbname=cdr;host=localhost', 
'postgres', 'postgres');
    $db->do($query);
  print $q->header();
  sub urldecode {
    my $url = shift;
    $url =~ s/%([a-fA-F0-9]{2,2})/chr(hex($1))/eg;
    return $url;
  }

上面的脚本是一个将通话记录插入到数据库中的一个简单的示例. @all_fields数组是一个包含了CDR表中每一个字段的列表.我们遍历这个列表寻找匹配的值.如果找到一个,我们使用urldecode和添加字段名到@fields及字段的值存储到@values.从这里,我们使用@fields和@values阵列,并创建 一个查询字符串,然后将其插入到数据库中。
See also
参考本章前些提到的秘决Using XML CDRs and Inserting records into a backend database

Using the event socket to handle CDRs

使用event socket处理CDR
有些时候你需要立刻获取到CDR的信息. FreeSWITCH通过非常强大的event socket来适应这类需求.本小节的秘方将会简短的描述如何在event socket上来接收CDR信息.本章节中你将会发现event socket接口上很多非常有用的信息.
Getting ready
本方法主要是依靠FreeSWITCH的event socket接口.不过,连接到event socket有很多种方式.正因为如此,我们要使用一个引用了event socket library库的简单Perl脚本来演示复杂的理论.任何支持ESL的语言都可以使用这里所演示的方法. 按照第4章 中的小窍门Setting up the event socket library设置event socket. 特别要说,为了执行示例的脚本一定要编译Perl模块.
How to do it…
Enter this script (or download it from the Packt website athttp://www.packtpub.com): 加入下面的脚本(或从Packt网站下载http://www.packtpub.com)

#!/usr/bin/perl

# handle_cdr.pl
# Connect to event socket, listen for CHANNEL_HANGUP_COMPLETE events
# Uses event data to create custom CDRs
  use strict;
  use warnings;
  use lib '/usr/src/freeswitch.git/libs/esl/perl';
  use ESL;

    my $host = "localhost"; my $port = "8021";
    my $pass = "ClueCon";
    my $con  = new ESL::ESLconnection($host, $port, $pass);
      if ( ! $con ) {
        die "Unable to establish connection to FreeSWITCH.\n";
      }

  ## Listen for events, filter in only CHANNEL_HANGUP_COMPLETE
    $con->events('plain','all');
    $con->filter('Event-Name','CHANNEL_HANGUP_COMPLETE');
      print "Connected to FreeSWITCH $host:$port and waiting for events...\n\n";
      while (1) {
        my @raw_data = split "\n",$e->serialize();
        my %cdr;
        foreach my $item ( @raw_data ) {
          #print "$item\n";
          my ($header, $value) = split ': ', $item;
          $header =~ s/^variable_//;
          $cdr{$header} = $value;
        }

        # %cdr contains a complete list of channel variables
        print "New CDR: ";
        print $cdr{uuid} . ', ' . $cdr{direction} . ', ';
        print $cdr{answer_epoch} . ', ' . $cdr{end_epoch} . ', ';
        print $cdr{hangup_cause} . "\n";
      }

运行本脚本和打一个测试电话. 一个简短的CDR将会被打印到屏幕上.
按Ctrl+C去退出脚本.

How it works…

这其中包含的基础原理如下:
1.建立一个ESL连接到Freeswitch
2.通过使用filter订阅事件CHANNEL_HANGUP_COMPLETE
3.把每个事件当成一个独立的CDR来处理 如果你更熟悉PHP, Python或Ruby你应该可以从我们的示例脚本转换这些概念到PHP,Python和Ruby. .
There’s more…

这里是一个小的提示, 帮助你了解使用event socket获取CDR最常用的用法.

ESL considerations

记住脚本需要找到ESL库. 注意此行: use lib ‘/usr/src/freeswitch.git/libs/esl/perl’; 这就是告诉Perl当使用附加的模块时在这个特定的目录下寻找.如果不添加这行, ESL指令会失败(或者你可以把必须的文件装到你的Perl的系统目录).
另一个重点是这种方法一通通话将会收到两个事件.A leg和B leg 都会生成一个 CHANNEL_HANGUP_COMPLETE 事件. A Leg的$cdr{direction}是”inbound”以及B Leg 的这个值是”outboud”.
最后, 记住这一行是阻塞的:
my $e = $con->recvEvent();
它会阻塞整个脚本直到有一个新的事件到达. 请参看第四章的过滤事件小技巧去了解一个recvEventTimed()方法的示例, 它是不阻塞的.
Receiving XML CDRs
通过event socket接收XML格式的CDR也是可以的. 这是是建立在每个呼叫的基础上, 使用hangup_complete_with_xml这个通道变量. 在你的diaplan中像下面这样设置为true:
<action application=”set” data=” hangup_complete_with_xml=true”/>
See also
Refer to the Using XML CDRs recipe in this chapter for more information on XML-based CDRs
Refer to the Setting up the event socket library and Filtering events recipes in Chapter 4

freeswitch-cookbook 第五章(一) PBX Functionality

07.20.2013, freeswitch-cookbook 第五章(一) PBX Functionality已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/35.html

PBX Functionality
本章中我们将涵盖

  • 创建用户
  • 使用语音邮箱
  • 公司目录
  • 使用短语宏创建语音提示
  • 创建XML IVR 菜单
  • 保持音乐
  • 创建会议室
  • 发邮件
  • 收邮件
  • Mod_flite TTS
  • 高级TTS  mod_tts_commandline
  • 使用telecast监听正在通话的内容
  • 录音


介绍

FreeSWITCH支持大多数电话系统或PBX的典型功能应用. 这个本章中的小方法重点将关注PBX中常用的功能, 像语音邮件, 传真, 通话录音, IVR菜单等等. 
添加用户
每一个Freeswitch都有一个用户目录.大多数情况下一个用户就是表示一个拥有电话的真实的人. 当我们说我们”添加用户’’我们指的是我们要创建一个用户目录中的用户账号(user account).每一个”user”都有一个SIP凭证拨打外部电话以及访问语音邮件的PIN number. 事实上, 你不能只拥有一个语音邮箱账号而不创建一个与它对应的用户账号.
准备
你得先有一个命令行界面 用来向你的操作系统执行命令. 使用add_user 脚本 , 你的操作系统需要安装Perl 语言环境.
How to do it…
创建用户只需要两步. 步骤如下:
1.  添加用户到directory
2.  添加对应号码到拨号方案 
让我们假想我们有一个刚装好的FreeSWITCH, 这表示我们拥有分机1009到1019 (拨号方案中的Local_Extension已经设置路由电话到这些分机 ).
让我们使用下面步骤添加用户:
1.  打开命令行和cd 到你的FreeSWITCH 源码目录.
2.  Linux 用户执行下面命令: ./scripts/perl/add_user 1020.
3.  Windows 用户做这个: perl scripts\perl\add_user 1020.
你会看到一些输出来确定用户已经创建.
下一步我们需要修改default context 中的 Local_Extension .
执行下面的步骤:
1.  使用一个文本编辑器打开conf/dialplan/default.xml.
2.  定位到名叫Local_Extension 的 diaplan extension.
3.  更改表达式^(10[01][0-9])$ 到 ^(10[012][0-9])$.
4.  保存文件退出.
然后在fs_cli中执行命令reloadxml.   用户1020现在已经可以用了. 测试, 使用一个SIP电话注册为1020然后使用它来拨打另一个电话.
How it works…  
add_user脚本只是简单的添加一个文件到directory中. 在例子中的 1020, 它创建了一个文件conf/directory/default/1020.xml.一旦文件创建(和你需要执行reloadxml命令)一个SIP电话就可以用这个用户注册了.然后, 默认拨号并不会处理当有些人拨打1020, 这就是为什么我们不得不更改default.xml中的Local_Extension. Local_Extension默认的< condition >是:
<condition field=”destination_number” expression=”^(10[01][0-9])$”>
这个pattern 匹配 1000, 1001, … 1019. 我们修改<condition>为这样:
<condition field=”destination_number” expression=”^(10[012][0-9])$”>
我们的新pattern 添加了 1020.1021…1029到Local_Extension. 为什么是整个一行而不是仅仅”1020”. 到是没什么阻止你这么干, 然后通常情况些我们都是添加一段用户而不是一次一个. 如果你愿意, 你可以使用下面的这个pattern:
<condition field=”destination_number” expression=”^(10[01][0-9]|1020)$”>
顺便说句, 不过, 这个就表示如果你想添加一个用户1021那么你就得再回来更改这个正则表达式pattern.
There’s more…  
Add_users 这个脚本包含些比较实用的功能(执行add_users –help 去查看完整的参数设置).  其实的一个有用的功能就是添加一组用户. 例如, 如果我们想添加一个完整的一组1020, 1021,….1029 我们不需要添加的时候为每个用户执行一次脚本. 取而代之的是, 使用—users参数指定一个范围: ./scripts/perl/add_user –users=1020-1029   注意add_user这个脚本不会覆盖已经存在的用户. Regular expressions with Regexp::Assemble 当你执行add_user脚本的时候,你可能在屏幕上看到过下面的提醒信息.
If CPAN module Regexp::Assemble were installed this program would be able to suggest a regex for your new users.
如果你安装了CPAN模块Regexp::Assemble, add_user脚本将会提示一个正则表达式. 一种快速安装这个模块的命令行是:
perl -MCPAN -e ‘install Regexp::Assemble’
现在当你使用这个脚本添加一个用户时会提示你一个正则表达式. 注意这只是一个提醒而已- 你还是需要自己检验表达式来确保它是你需要的.
See also
参考第2章中的 配置一个SIP电话注册到FreeSWITCH方法.
Accessing voicemail(访问语音邮箱)
语音邮箱是PBX系统中一个非常普通的功能.本方法将会讲述如何为用户接入语音邮件.
Getting ready
你需要至少有一部注册在你系统上的电话, 然后有两部和多部电话测试会更简单些.和其他用户通话.目标分机会把通话送到语音邮件. 主叫留下一个信息然后挂断. 一旦留下一个信息, 目标电话就可以访问语音邮件了.
How to do it…  
访问语音邮件的最简单方法就是直接拨*98. 系统将会需要输入用户ID和密码(默认下密码和USER ID相同). 让我们假设1001正在检查她的语音信息. 她需要做下面步骤:
1.  Dial *98, wait for system to answer.拨打*98, 等待系统应答.
2.  Enter the ID and press # (1001# in our example).输入ID然后按#(在我们的例子中是1001)
3.  Enter the password and press # (1001# in our example).输入密码然后按#(在我们的例子中是1001)
4.  New messages are automatically played.新的留言会自动播放
从语音邮件系统中退出简单的挂断电话.
How it works…  
语音邮件系统无非就是一个特殊类型的IVR系统. 在这种情况下用户可以登录以及有多种选择.
主菜单选项如下所示:
sa.png
当听取新留言和已保存留言时用户有以下选项:
sb.png
当留言已经被播放, 有以下选项:
SC.png
高级选项如下:
SD.png
大多数用户会发现FreeSWITCH的语音邮件系统非常的面熟, 这是因为FreeSWITCH模仿了大多数主要的移动运营商使用的语音邮件系统.
See also
Refer to the Confguring a SIP phone to register with FreeSWITCH recipe in Chapter 2

Freeswitch 添加ITU G729编码

07.20.2013, Freeswitch 添加ITU G729编码已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/21.html

默认情况下Freeswitch自带的G729模块是pass-through-并不支持转码. 不过我们依然有个好奇的心, 所以我们决定添加一个支持G729转码的模块到Freeswitch.
1. 下载mod_g729.zip (改自Deepwalker-fs_itu_g729-0bcddb5.tar)
2. 解压 #unzip mod_g729.zip
3. 删除原来的模块, 将新模块添加到codec目录中

rm -rf src/mod/codecs/mod_g729 
mv mod_g729 /src/mod/codecs/

4. 尝试编译

cd src/mod/codecs/mod_g729 
make

5. 测试 配置两个SIP终端A和B, 其中A只选择PCMA, B只选择G729.
备注: 
测试freeswitch版本 1.2.1  64位系统.
用于生产环境请到freeswitch.org 购买授权, 以及使用freeswitch官方的模块.

 

 

测试过可用,非常占CPU

FreeSWITCH-Cookbook 第三章(一) Processing Call Detail Records(处理CDR)

07.20.2013, FreeSWITCH-Cookbook 第三章(一) Processing Call Detail Records(处理CDR)已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/5.html

第三章:Processing Call Detail Records(处理CDR)

在本章节中将会涵盖

使用CSV CDRS

使用 XML CDRS

将CDR插入到一个后端数据库

使用WEB SERVER 处理CDR

使用event socket 处理CDR

Introduction 介绍

CDR是所有电话系统账单处理的重要组成。它们也是可以用于排错的重要资源。Freeswitch提供多种方法来生成CDR.最普通的方法是创建基于文本的,逗号分割的CSV文件。CSV文件中每一行都描述一通电话(或更准确地说是一个call leg).当然也有其他的方法去处理CDR,最值得一提的就是使用mod_xml_cdr去存储更多更详细的通话信息,也可以使用event_socket去处理CDR信息。

Using CSV CDRs  使用CSV的CDR

存储CSV格式的CDR是非常简单的。下面的方法就是描述使用CSR文件存储通话记录的必要步骤。

准备Getting ready

mod_cdr_csv模块默认已经编译和加载。CDR文件存储在目录$FS_INSTALL/log/cdr-csv/。确定配置是否启用,打开文件 conf/autoload_configs/cdr_csv.conf.xml。下面就是设置中可用的参数。

<settings>

    <!– ‘cdr-csv’ will always be appended to log-base –>

    <!–<param name=”log-base” value=”/var/log”/>–>

    <param name=”default-template” value=”example”/>

    <!– This is like the info app but after the call is hung up –>

    <!–<param name=”debug” value=”true”/>–>

    <param name=”rotate-on-hup” value=”true”/>

    <!– may be a b or ab –>

    <param name=”legs” value=”a”/>

    <!– Only log in Master.csv –>

    <!– <param name=”master-file-only” value=”true”/> –>

  </settings>

在下面的章节中,我们将会讲解这些参数.

How to do it…  如何看到CDR

最简单的方式去看新CDR是在linux下使用cat或在windows环境下使用type. 另外,如果你在Linux/Unix环境你可以使用tail程序去看文件的结尾。(Windows没有提供tail程序,但是也有另一个免费和开源的方案)

Linux/Unix环境下的步骤:

1.  进入目录/usr/local/freeswitch/log/cdr-csv/

2.  执行tail -f Master.csv去显示新的CDR条目。

3.  打一个测试电话,也许用一个电话打另一个电话。

4.  挂断测试电话和注意新的CDR已经添加到了Master.csv.

5.  使用Ctrl+c去退出tail命令

这里是一个示例的CDR, 1001拨打1007.

“Michael Collins”,”1001″,”1007″,”default”,”2011-03-02 12:09:25″,”2011-

03-02 12:09:26″,”2011-03-02 12:09:29″,”4″,”3″,”NORMAL_

CLEARING”,”f896639c-4508-11e0-a4cb-fb7d5a93c62e”,”f89d504e-4508-11e0-

a4cc-fb7d5a93c62e”,”1001″,”G722″,”G722″

How it works…如何工作

通过查看该文件我们可以获取到写入硬盘中的新的CDR. 但在生产环境中并不是特别的有用, 我们做这个是帮助我们去学习CDR和它们包含的信息。而且,这也是在你使用FS的路上一个简单的排除错误的工具。

There’s more…  不止这些

当使用CSV CDR时还有些东西是需要我们关注的。下面的小节就是帮助你充分的使用它们。

File names and locations   文件名和位置

如果你列出目录log/cdr-csv,你可能会看到除了Master.csv文件外的其他文件。例如,你使用1001打了1007,你会看到一个名叫1001.csv的文件(记住,这个文件名是由用户的directory 配置中的accountcode属性决定).默认,每一个 directory user 都拥有他自己的.csv文件,此文件中只包含他自己的通话记录。这纯粹是一个方便的功能,可以通过设置conf/autoload_configs/cdr_csv.conf.xml 文件中的这个参数来禁用它:

<param name=”master-file-only” value=”true”/>

You may see other fles with date/time stamps in their names like this:

你可能还看到一些包含 日期/时间戳 的文件像这样:

Master.csv.2011-02-24-16-51-06

这些文件是当日志滚动请求发生时创建的。这个行为也可以通过调协下面的参数来改变:

<param name=”rotate-on-hup” value=”false”/>

最后,你可以通过使用base-log参数指定产生cdr-csv文件夹的基础目录。例如,设置<param name=”log-base” value=”/var/log”/>将会强制生成CSV CDR文件到/var/log/cdr-csv文件夹。

当修改了cdr_csv.conf.xml文件中有参数,请确保保存且在fs_cli控制台中执行reload mod_cdr_csv 命令去使修改生效。

Other options 其他选项

在cdr_csv.conf.xml文件的设置部分还有几个其他选项。第一个就是debug。设置debug为true将会把每一个通话结束时都执行一次 information dump(像diaplan中的info application)。

注意不仅产生到fs_cli还有FreeSWITCH的日志文件,请注意磁盘空间。

来说另一个名叫legs有参数. 它决定哪个leg或哪些leg将产生CDR。默认只有A leg(主叫)产生一条CDR。 你可以把这个参数设置成“b”来只记录B leg(被叫)或你可以设置它为”ab”,这样你以收到每个leg的CDR.处理A和B leg稍后会在本章中讨论。

CDR CSV templates  CDR CSV 模块

Default-template 参数决定在创建CDR记录时使用哪种模板。注意cdr_csv.conf.xml文件中的<templates>片断。<template>片断中有一些你可以使用和编辑的模板。你也可以你自己的模板。默认我们使用的是example模板。随便更改和编辑default-template 参数去使用不同的模板。Asterisk模块将会产生可供astersik PBX使用的CDR格式。Sql 模板将会产生一种特别有用的格式,我们将会在方法 插入CDR到后端数据库 中讨论。

模板还有另外有一个功能,允许自定义行为。当一个channel中的accountcode变量被设置成了一个模板的名字,那么通话的CDR将会使用名为accountcode模板格式。你可以通过设置一个 directory user 的account code 来测试这个功能:

1. 打开conf/directory/default/1007.xml和设置:

<variable name=”accountcode” value=”sql”/>

2. 保存文件退出。在fs_cli中执行命令reloadxml。

3. 使用1007拨打另一个电话,接听,然后挂断。

4. 现在在你的cdr-csv目录中将会有一个名叫sql.csv的文件。

这个小技巧可以用来定制CDR数据存储的方式。例如,你可能想记录指定终端的一些指定channle变量到CDR文件中,然后,你可能并不希望每一通通话都存储这些信息。使用accountcode和一个CDR CSV 模板允许你按需要来定制行为。

See also  参见

请参阅本章后面――插入CDR到后端的数据库

Using XML CDRs 使用XML CDR

XML CDR 拥有在传统的CSV 平面格式无法简单描述的大量信息。在这个小方法中,我们将会开启mod_xml_cdr 和 讨论它的一些配置选项。

Getting ready 准备

默认的配置中,mod_xml_cdr 已经被编译了但没有启用。使用下面步骤来开启它:

1. 打开 conf/autoload_configs/modules.conf.xml

2. 取消下面一行的注释

<!– <load module=”mod_xml_cdr”/> –>

3.保存文件退出

现在当Freeswitch启动时mod_xml_cdr 将会自动加载。不过,如果Freeswitch已经在运行中了,我们就需要手动来加载它。只需要简单地在fs_cli 中输入命令 load mod_xml_cdr 就能完成加载了。XML CDR 文件将会保存在$FS_INSTALL/log/xml-cdr 文件夹中。

XML CDR有很多的选项,打开文件conf/autoload_configs/xml_cdr.conf.xml 来查看它们。在本节稍后我们将会讨论一部分参数。

How to do it…

查看最新的XML CDR的方式最简单的方法是在Linux/Unix 环境下使用cat,在windows环境下使用type这类的工具(注意,windows 的 Povershell有一个cat的别名)。或者你可以使用像less 这样的翻页工具去查看整个文件。Windows 和 Linux/Unix都支持管道输出到more来达到相同的效果。

下面是你可以在Linux/Unix环境下使用的步骤:

1. 进入目录 /usr/local/freeswitch/log/xml-cdr/

2. 使用ls命令列出目录内容

3. 拨打一个测试电话,也许从一个电话到另一个。

4. 挂断电话,注册类似这样a_uuid.xml 命名的新XML CDR.

5. 输入 less a_uuid.xml 和 按回车键 来查看XML CDR 文件中的内容。

How it works…

通过监视 log/xml-cdr 目录,我们可以获取写入到硬盘的新CDR。在生产环境是就不那么实用了,做这个可以帮助我们了解XML CDR和它们包含的信息。更进一步说,它是一个将来你能用到的简单排错工具。

什么是UUID?

处理CDR,尤其是XML CDR, 会有很多的UUID出现在你面前. UUID的全意是 Universally Unique Identifier (全球唯一标识符号)。它是一个使用连字符(-)分成5部分的32个16进制数字。一个示例UUID 678a195f-8431-4d77-8f10-550f7435f18e。每一个call leg 都会收到一个UUID用来不同于其他的call leg 。

There’s more…

Mod_xml_cdr 模块可以做很多事情,最重要的就是POST 新的XML CDR 信息到一个只是存储CDR到数据库或执行其他计费功能的WEB服务器。

File names and locations

在文件 conf/autoload_configs/xml_cdr.conf.xml文件中的<setting> section 中有两个参数用来影响文件名和文件存储位置。第一个参数就是 prefix-a-leg. 当设置为true的时候, A leg 的XML CDR 的文件名都会有一个”a_”前缀。这样就可以很轻松的区分A leg和B leg 的CDR。另一个参数就是 log-dir, 当设置为一个绝对路径的时候它会改变 /xml-cdr 的保存位置。例如:<param name=”log-dir” value=”/var/log”/>

这样设置会让所有的XML CDR 写到目录 /var/log/xml-cdr 目录中(你也可以把log-dir 设置成相对路径,但很少有人用)

NOTE:当改变了xml_cdr.conf.xml文件中的参数时,请确定保存和通过fs_cli执行命令reload mod_xml_cdr 来使之生效。

Logging the B leg

默认情况下, mod_xml_cdr 只记录A leg (主叫)。如果你希望记录B leg(被叫),那么设置这个参数:

<param name=”log-b-leg” value=”true”/>

这样B leg的 XML CDR 也会被记录。注意 B leg 的CDR 永远命名为uuid.xml,UUID就是通话的真实UUID。没有一个像A leg那样的选项用来配置成以”b_”前缀来命名文件。

See also

在本章的后面,请参阅使用WEB SERVER 处理CDR。

Inserting CDRs into a backend database(插入CDR到后端的数据库)

常常插入CDR信息到一个数据库如MYSQL,POSTGRESQL或其他的数据库是有必要的。FreeSWITCH不支持将CDR直接写入到数据库(不直接写入到数据库这个决定是一个engineering,并不是技术限制)。这个方法讨论一个简单的方法,写一个SQL语句的CSV文件和使用这些CSV文件去更新后台的数据库。

Getting ready

当然,你需要一个数据库去保存你的文件。任何的数据都可以,只要是能使用SQL 语句。为您的CDR创建一个数据库,并允许任何必要的访问权限。这完全由你的数据库类型决定-参阅你的数据库文档来做。

你还需要准备一个存储CDR的表。下面的创建表的语法是适用与PGSQL数据库和cdr_csv.conf.xml配置文件中的SQL模板:

CREATE TABLE cdr (

caller_id_name character varying(30),

caller_id_number character varying(30),

destination_number character varying(30),

context character varying(20),

start_stamp timestamp without time zone,

answer_stamp timestamp without time zone,

end_stamp timestamp without time zone,

duration integer,

billsec integer,

hangup_cause character varying(50),

uuid uuid,

bleg_uuid uuid,

accountcode character varying(10),

read_codec character varying(20),

write_codec character varying(20)

);

适用与MYSQL的生成表语句是:

CREATE TABLE cdr (

caller_id_name varchar(30) DEFAULT NULL,

caller_id_number varchar(30) DEFAULT NULL,

destination_number varchar(30) DEFAULT NULL,

context varchar(20) DEFAULT NULL,

start_stamp datetime DEFAULT NULL,

answer_stamp datetime DEFAULT NULL,

end_stamp datetime DEFAULT NULL,

duration int(11) DEFAULT NULL,

billsec int(11) DEFAULT NULL,

hangup_cause varchar(50) DEFAULT NULL,

uuid varchar(100) DEFAULT NULL,

bleg_uuid varchar(100) DEFAULT NULL,

accountcode varchar(10) DEFAULT NULL,

domain_name varchar(100) DEFAULT NULL

);

在本方法中的所有示例都使用数据库CDR和表CDR。最后一件事就是设置SQL模板为默认的CDR模板。请按照以下步骤操作:

1. 打开文件 conf/autoload_configs/cdr_csv.conf.xml.

2. 改变default-template 参数到<param name=”default-template” value=”sql”/>.

3. 保存文件和退出。在控制台fs_cli中执行命令reload mod_cdr_csv

4. 在fs_cli 中执行 fsctl send_sighup 去rotate(滚动)日志文件。

现在你可以创建和处理CDR了。

How to do it…

按照以下步骤去将一条通话记录插入到你的数据库表中:

1. 从一个电话拨打另一个电话进行测试呼叫,接听,等待一会,然后挂断(Master.csv文件中至少有一条记录)

2 在fs_cli 中执行命令 fsctl send_sighup

3. 列出目录 log/cdr-csv/文件夹中的内容,注意一个 rotated(滚动) Master.csv 文件,例如 Master.csv.2011-03-02-16-25-21.

4. 这个滚动的日志文件就是用来插入通话记录到你的数据库, 根据数据库的不同你需要不同的命令去插入记录. 例如,PGSQL使用下面的命令:

cat Master.csv.2011-03-02-16-44-29 | tr \” \’ | psql -U postgres cdr

5. 使用一个简单的SQL语句 SELECT * FROM cdr 去检查记录是否已经插入到了CDR表中.删除rotated(滚动)日志文件.

How it works…

mod_cdr_csr 的模板sql会把CDR使用SQL语句的格式来保存. 示例记录看起来像这样:

INSERT INTO cdr VALUES (“Michael Collins”,”1001″,”1007″,”defa

ult”,”2011-03-02 17:02:21″,”2011-03-02 17:02:23″,”2011-03-02

17:02:25″,”4″,”2″,”NORMAL_CLEARING”,”e4cfe0b2-4531-11e0-b634-

d7bcff4e7b8a”,”e4d6b072-4531-11e0-b635-d7bcff4e7b8a”, “1001”);

这些SQL语句可以输入到一个基于命令行的数据库客户端. 为了兼容PGSQL使用tr命令转换双引号到单引号.

你的实际生产环境中可能会有不同的需求就像在PGSQL中要使用单引号而非双引号.使用Unix 命令 tr 是处理这类问题的一种方法. 你也可以改变模板文件来使用单引号而非双引号.

最后, 当确定CDR已经成功的插入到了数据库中,我们删除滚动日志. 我们也可以把它们归档到另一个盘符中做个备份.

There’s more…

大多数的系统管理员应该会意识到这里的命令是很容易编写成脚本的.事实上,这也是FreeSWITCH的开发者没有创建一个直接写入到数据库的本地模块原因之一. 直接写到CDR到硬盘然后使用cron 任务计划(或类似的)去执行剩下的所有任务. 把它们分解成离散的任务, 而不是抽象它们在freeswitch的模块中, 可以更轻松的使用现成的方法去创建健壮的,可扩展的解决方案.

事实上, 你可以将存储CDR的数据库装在另一台独立的服务器上, 使用最基本的命令像 fs_cli去滚动日志和SCP或FTP将 通话记录文件下载到本地数据库服务器. 一个智能化的脚本可以在发出问题时通知系统管理员.而且,只要FreeSWITCH 服务器上有磁盘空间, 就算CDR服务器和CDR服务器之间的连接断开也不会有任何的通话记录丢失. CDR将会继续写到FS的硬盘上, 当它们之间的连接重新建立时可以继续收集和处理CDR.

See also

Refer to the Getting familiar with the “fs_cli” interface recipe in Chapter 4

请参考第四章中的小秘方 – 熟悉fs_cli 接口

freeswitch能做什么

07.19.2013, freeswitch能做什么已关闭评论, freeswitch, by .

来自freeswitch-cn群 杜大的PPT

QQ图片20130719004704

freeswitch 默认CSV保存CDR通话记录

07.18.2013, freeswitch 默认CSV保存CDR通话记录已关闭评论, freeswitch, by .

freeswitch默认会将通话记录放到 $FS_INSTALL/log/cdr-csv/Master.csv文件中,当通话被挂断时,freeswitch会自动记录。
    

通话记录CSV的配置文件在 conf/autoload_configs/cdr_csv.conf.xml 中。

 

修改后记得reload mod_cdr_csv

 

即默认使用cdr_csv模块记录CDR

 

cdr_csv模块具体可查看官方 https://wiki.freeswitch.org/wiki/Mod_cdr_csv

freeswitch core windows下odbc 连接mysql

07.18.2013, freeswitch core windows下odbc 连接mysql已关闭评论, freeswitch, by .

1:安装mysql windows下的odbc 连接件

http://dev.mysql.com/downloads/connector/odbc/

2:mysql建立一个表名freeswitch

3:windows进控制面板->管理工具->数据源ODBC

创建用户DSN 连接mysql freeswitch表

details 内需选择allow multiple statements

4:修改conf\autoload_configs\switch.conf.xml下的

<param name=”core-db-dsn” value=”freeswitch(数据库名):root(数据库用户):’(数据库密码)’ />

5:重启下FS,自动在数据内生成表

 

参考资料:https://wiki.freeswitch.org/wiki/Using_ODBC_in_the_core

asterisk sip header

07.09.2013, asterisk sip header已关闭评论, asterisk, by .

 

取得header内t开头 做为被叫号码

Set(DSTNUM=${CUT(SIP_HEADER(t),@,1):5})