吴伟贤のBlog

Feed Rss

freeSWITCH中动态加载模块

01.17.2013, freeSWITCH中动态加载模块已关闭评论, freeswitch, by .

在下载完freeswitch源码之后,我们通常按照默认的模块配置文件(freeswitch/modules.conf)进行编译、安装。
但在之后的工作中默认的模块肯定不能满足我们的开发需求,所以需要动态加载一些模块。
具体的步骤如下:

1、修改配置
#sudo vi freeswitch/modules.conf
去掉我们需要加载模块前面的#

2、在模块所在的目录编译模块
例如我们需要添加codec目录下的mod_ilbc模块

#cd freeswitch/src/mod
#sudo make mod_ilbc

3、安装模块
在freeswitch目录下安装需要添加的模块
#cd freeswitch
#sudo make mod_ilbc-install

centos6.3安装freeswitch

01.17.2013, centos6.3安装freeswitch已关闭评论, freeswitch, by .

1:下载依赖库
sudo yum install git autoconf automake libtool ncurses-devel libjpeg-devel

sudo yum install expat-devel openssl-devel libtiff-devel libX11-devel unixODBC-devel libssl-devel python-devel zlib-devel libzrtpcpp-devel alsa-lib-devel libogg-devel libvorbis-devel perl-libs gdbm-devel libdb-devel uuid-devel @development-tools

2:下载freeswitch
cd /usr/local/src
git clone git://git.freeswitch.org/freeswitch.git
  cd freeswitch
  ./bootstrap.sh

3:编辑模块 Edit modules.conf

   freeswitch目录中的modules.conf配置编译需要加载哪些模块

4:编辑源码
./configure
make

5:安装freeswitch
make all install cd-sounds-install cd-moh-install

6:运行freeswitch
/usr/local/freeswitch/bin/freeswitch

 

后台运行

/usr/local/freeswitch/bin/freeswitch -nc

7:测试
用户1000-1019 密码1234
拨打9664 会听到音乐
拨打5000 进行IVR

收集的php一维数组 二维数组排序方法

01.04.2013, 收集的php一维数组 二维数组排序方法已关闭评论, php, by .

一维数组

1 :sort 和 rsort ,按照PHP数组键值的顺序asc和逆序desc进行排序,同时破坏原来数组的索引关系——其实是删除索引之后重新建立从0开始的数字索引。

2 :asort 和 arsort ,这两个函数就比较厉害一点了,只要他们可以保留数组原有的索引关系

3 :krsort 和 ksort 这两个不同于以上两组,这两函数是对键名进行排序的

3 :通过自定义函数对PHP数组进行排序,有三个函数分别是:
uasort 通过自定义函数对PHP数组的键值进行排序,并且保留原来的索引关系。
uksort 通过自定义函数对PHP数组的键名进行排序,并且保留原来的索引关系。
usort通过自定义函数对PHP数组的键值进行排序,并且删除原来的索引关系,从零开始建立新的索引。

 

 

二维数组

1.PHP二维数组排序函数

PHP一维数组的排序可以用sort(),asort(),arsort()等函数,但是PHP二维数组的排序需要自定义。

以下函数是对一个给定的二维数组按照指定的键值进行排序,先看函数定义:

function array_sort($arr,$keys,$type=’asc’){ 

$keysvalue = $new_array = array();

foreach ($arr as $k=>$v){

$keysvalue[$k] = $v[$keys];

}

if($type == ‘asc’){

asort($keysvalue);

}else{

arsort($keysvalue);

}

reset($keysvalue);

foreach ($keysvalue as $k=>$v){

$new_array[$k] = $arr[$k];

}

return $new_array; 

它可以对二维数组按照指定的键值进行排序,也可以指定升序或降序排序法(默认为升序),用法示例:

$array = array(

array(‘name’=>’手机’,’brand’=>’诺基亚’,’price’=>1050),

array(‘name’=>’笔记本电脑’,’brand’=>’lenovo’,’price’=>4300),

array(‘name’=>’剃须刀’,’brand’=>’飞利浦’,’price’=>3100),

array(‘name’=>’跑步机’,’brand’=>’三和松石’,’price’=>4900),

array(‘name’=>’手表’,’brand’=>’卡西欧’,’price’=>960),

array(‘name’=>’液晶电视’,’brand’=>’索尼’,’price’=>6299),

array(‘name’=>’激光打印机’,’brand’=>’惠普’,’price’=>1200)

);

$ShoppingList = array_sort($array,’price’);

print_r($ShoppingList);

上面是对$array这个二维数组按照’price’从低到高的排序。

输出结果:(略)。

 

 

2.PHP二维数组在排序的应用

最近弄一个二次开发的API接口,一直在找PHP是否可以直接对二维数组中的某个键名进行排序,平时PHP对一维数组的排序比较简单,但是当我们在读取数据库写入数组后,可能经过一系列复杂的操作,最后形成一个二维数组,那次是如果为了更好的浏览数据,就必须对这个二维数组按不同键名进行排序。

查了下手册PHP本身有一个多维数组排序的函数:

bool array_multisort ( array $arr1 [, mixed $arg [, mixed $… [, array $… ]]] )

下面是手册当中对于array_multisort函数的描述:

array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。

关联(string)键名保持不变,但数字键名会被重新索引。

输入数组被当成一个表的列并以行来排序――这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。

由于我们通常取出处理的二维数组是这样的:

$arr = array (

1 => array(‘id’ => 2, ‘fid’ => ‘3’ , ‘data’ => ‘aa’ ),

2 => array(‘id’ => 3, ‘fid’ => ‘1’ , ‘data’ => ‘bb’ ),

3 => array(‘id’ => 1, ‘fid’ => ‘2’ , ‘data’ => ‘bb’ )

);

假如我们需要把这个数组按照fid排序,按照array_multisort函数的要求我们就要取出fid这一列,然后根据这一列的升序,来调整原来的数组也升序。

function multi_array_sort($multi_array,$sort_field,$sort_type = SORT_ASC){

if (!is_array($multi_array)) return FALSE;

foreach ($multi_array as $row){

if(! is_array($row)) return FALSE;

$arr_field[] = $row[$sort_field];

}

array_multisort($arr_field,$sort_type,$multi_array);

return $multi_array;

}//看看结果

print_r(multi_array_sort($arr, ‘fid’,SORT_DESC));

mysql union all 中使用 含order by子查询 注意事项

01.04.2013, mysql union all 中使用 含order by子查询 注意事项已关闭评论, mysql, by .

union all中使用order by子查询时需将含order by的子查询包在一个不含order by的查询里再进行union all。

否则会报“Incorrect usage of UNION and ORDER BY”

 

例如:

1.错误用法:

           select id from test1 order by id

           union all

           select id from test2 order by id

2.正确用法:

           select * from (select id from test1 order by id) t1

           union all

           select * from (select id from test2 order by id) t2

freeswitch g729官方授权购买及安装

12.30.2012, freeswitch g729官方授权购买及安装已关闭评论, freeswitch, by .

因项目需要做G711->G729的转编码

参考了非官方的g729及咨询编码卡的价格,最终决定购买官方的G729编码,价格1channel 10美金

1:此文章前提是你已安装了freeswitch

2:授权只针对linux

一:添加订单

登录http://www.freeswitch.org/ 最上面的导航菜单选择G.729

点击最下面有个”Add to cart ”,  修改 Qty (数量) ,然后点击”Update Cart”,后”check out with paypal”,

使用paypal付款完后,返回订单,让你填写 公司名 联系电话 备注等信息 提交后

这时,请注意了,如果你还没注册过用户,会返回跟你paypal一样的用户名及随机生成的密码,请保管好这个.

下面将使用这个用户名及密码得到授权

二:取得授权

使用用户名密码登陆后 点击 网站首页 最左边的”My Account” ,点击”Order History”,点击order number后,找找有 Product Activation Code:

后面的就是授权码

三:安装授权

从下面链接下载g729安装文件

http://files.freeswitch.org/g729/

里面有两个安装文件

fsg729-191-installer

fsg729-194-installer

不知道区别是什么,我自己安装的是fsg729-191-installer

cd /usr/tmp

wget http://files.freeswitch.org/g729/fsg729-191-installer

chmod 755 fsg729-191-installer

./fsg729-191-installer

提示许可协议,按y 后安装完成,

运行/usr/local/freeswitch/bin/validator

G.729A licencing tool

You will require one or more sales codes to activate G.729A

Enter a sales code, or a blank line to end: xxxxxxxxxxxxxxxx (在这个提示内输入授权码)

Enter a sales code, or a blank line to end: (如果你只有一个授权码,第二个直接按回车就可)

Sales codes to be activated: xxxxxxxxxxxxxxxx

OK (Y/N)? y

Success. The file licences.zip contains valid licence(s) for G.729A. Unzip this to /etc/freeswitch/

提示Success后, 在当前目录下你会找到一个文件名为licences.zi的文件,这个文件要把他解包到/etc/freeswitch内

mv licences.zip /etc/freeswitch/

cd /etc/freeswitch/

unzip licences.zip

Archive: licences.zip

inflating: xxxxxxxxxxxxxxxx.conf

Please back this xxxxxxxxxxxxxxxx.conf as you do NOT need to re-validate your license once you have this signed file.

 

四;配置freeswitch,添加mod_com_g729模块

因mod_g729及mod_com_g729不能共存,所以必须先卸载mod_g729

卸载mod_g729

/usr/local/freeswitch/bin/fs_cli

unload mod_g729

加载mod_com_g729

load mod_com_g729

将可能输出如下文字:

freeswitch@internal> load mod_com_g729

+OK

2010-04-04 13:14:35.204281 [INFO] mod_com_g729.c:198 Permitted G.729A channels: 1

freeswitch@internal> 2010-04-04 13:14:35.204281 [CONSOLE] switch_loadable_module.c:900 Successfully Loaded [mod_com_g729]

2010-04-04 13:14:35.204281 [NOTICE] switch_loadable_module.c:184 Adding Codec ‘G729’ (G.729) 8000hz 10ms

2010-04-04 13:14:35.204281 [NOTICE] switch_loadable_module.c:184 Adding Codec ‘G729’ (G.729) 8000hz 20ms

2010-04-04 13:14:35.204281 [NOTICE] switch_loadable_module.c:184 Adding Codec ‘G729’ (G.729) 8000hz 30ms

2010-04-04 13:14:35.204281 [NOTICE] switch_loadable_module.c:184 Adding Codec ‘G729’ (G.729) 8000hz 40ms

2010-04-04 13:14:35.204281 [NOTICE] switch_loadable_module.c:184 Adding Codec ‘G729’ (G.729) 8000hz 50ms

2010-04-04 13:14:35.204281 [NOTICE] switch_loadable_module.c:184 Adding Codec ‘G729’ (G.729) 8000hz 60ms

2010-04-04 13:14:35.204281 [NOTICE] switch_loadable_module.c:184 Adding Codec ‘G729’ (G.729) 8000hz 70ms

2010-04-04 13:14:35.204281 [NOTICE] switch_loadable_module.c:184 Adding Codec ‘G729’ (G.729) 8000hz 80ms

2010-04-04 13:14:35.204281 [NOTICE] switch_loadable_module.c:184 Adding Codec ‘G729’ (G.729) 8000hz 90ms

2010-04-04 13:14:35.204281 [NOTICE] switch_loadable_module.c:184 Adding Codec ‘G729’ (G.729) 8000hz 100ms

2010-04-04 13:14:35.204281 [NOTICE] switch_loadable_module.c:184 Adding Codec ‘G729’ (G.729) 8000hz 110ms

2010-04-04 13:14:35.204281 [NOTICE] switch_loadable_module.c:184 Adding Codec ‘G729’ (G.729) 8000hz 120ms

2010-04-04 13:14:35.204281 [NOTICE] switch_loadable_module.c:272 Adding API Function ‘g729_status’

 

输入g729_status 或者是g729_info

会显示

freeswitch@internal> g729_status

Permitted G.729A channels: 1

Encoders in use: 0

Decoders in use: 0

这说明授权成功了

 

编辑modules.conf

把mod_g729修改为mod_com_g729

 

g729授权大功告成

 

注意点:

1:因授权是绑定MAC,所以不能使用虚拟盘,要使用实体盘

2:网卡名必须ech开头的.  我装的是centos6.2网卡名是em开头的.这个要修改成ech开头的, 不然授权时会再现 ERROR(null) 类似的提示

 

参考资料:

http://www.freeswitch.org/node/235

http://wiki.freeswitch.org/wiki/Mod_com_g729

http://files.freeswitch.org/g729/

通过FreeSwitch同时呼叫多个用户

12.28.2012, 通过FreeSwitch同时呼叫多个用户已关闭评论, freeswitch, by .

通过FreeSwitch可以对多个终端进行呼叫,依据振铃顺序不同,可以分为:同振 和 顺振 。

同振是指多个终端同时振铃;顺振是指多个终端顺序振铃。

下面实现如下应用, 某用户拨叫 2000 这个接入号码,希望 1000 和 1001 同时振铃,其中任一个接听来话,另一个停止振铃。

(1) 在 \conf\dialplan\default.xml中添加如下内容,

<extension name=”group_dial_sim”>

<condition field=”destination_number” expression=”^2000$”>

<action application=”bridge” data=”sofia/internal/1000@192.168.0.183,sofia/sip/1001@192.68.0.183″/>

</condition>

</extension>

在 FS_CLI.exe 中运行 reloadxml 即可。

下面实现如下应用, 某用户拨叫 2000 这个接入号码,希望 1000 和 1001 顺序振铃,其中任一个接听来话,另一个停止振铃。

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

<extension name=”group_dial_seq”>

<condition field=”destination_number” expression=”^2000$”>

<action application=”bridge” data=”sofia/internal/1000@192.168.0.183|sofia/sip/1001@192.68.0.183″/>

</condition>

</extension>

在 FS_CLI.exe 中运行 reloadxml 即可。

FreeSwitch中用户不经过认证即可注册成功

12.28.2012, FreeSwitch中用户不经过认证即可注册成功已关闭评论, freeswitch, by .

一般来说,FreeSwitch中的SIP 用户都需要通过用户名和密码进行认证后才能注册成功,并进行通话。若有特殊需要,也可以设置为无认证即可使用,具体设置如下 :

打开 \conf\sip_profiles\internal.xml ,将如下两条设置去掉注释即可,

<!– <param name=”accept-blind-auth” value=”true”/> –>

<!– <param name=”suppress-cng” value=”true”/> –>

即:

<param name=”accept-blind-auth” value=”true”/>

<param name=”suppress-cng” value=”true”/>

在 FS_CLI.exe 中运行 reloadxml 即可。

利用内置的WEB接口控制FreeSWITCH

12.28.2012, 利用内置的WEB接口控制FreeSWITCH已关闭评论, freeswitch, by .

从外部控制FreeSWTCH的方法有两种 – 通过EVENT SOCKET ;通过 built-in web interface。

下面具体介绍怎么通过内置的WEB接口控制FreeSWITCH。

1、安装 mod_xml_rpc 模块。

(1)WINDOWS版本的FreeSWITCH默认已安装。

(2)LINUX版本的FreeSWITCH需要按以下步骤进行安装使用。

i、在 modules.conf 中,将 #xml_int/mod_xml_rpc 修改为 xml_int/mod_xml_rpc。

ii、编译 mod_xml_rpc 模块

make mod_xml_rpc -install

iii、在 fs_cli 中运行 :load mod_xml_rpc 加载该模块。

2、访问方法:在IE地址栏输入  http://x.x.x.x:8080 ,x.x.x.x 是FreeSWITCH所在 主机 的 IP 。

3、输入  status 命令 的 方法 : http://x.x.x.x:8080/webapi/status

说明 : 通用格式 – http://x.x.x.x:8080/webapi/cmd?args

例如 :查看当前通话 http://x.x.x.x:8080/webapi/show?channels

官方链接 : http://wiki.freeswitch.org/wiki/Freeswitch_XML-RPC

FreeSwitch作为中转网关

12.28.2012, FreeSwitch作为中转网关已关闭评论, freeswitch, by .

需求:现有软交换服务器A(ip:192.168.100.100)

FS软交换服务器B(ip:192.168.100.101)

软交换服务器C(ip:192.168.100.102)

现要求B服务器实现 ,所有A服务器过来的呼叫,都路由到C服务器。纯IP对接。

实现:

第一步,把如下 内容放到

/freeswitch/conf/dialplan/public.xml

<extension name=”gw1_Extension”>

<condition field=”network_addr” expression=”^192\.168\.100\.100$”>

<action application=”bridge” data=”sofia/gateway/gw1/${destination_number}”/>

</condition>

</extension>

第二步,把如下内容放到 /freeswitch/conf/sip_profiles/external/gw1.xml

<gateway name=”gw1″>

<param name=”proxy” value=”192.168.100.102:5060″/>

<param name=”realm” value=”192.168.100.102:5060″/>

<param name=”register” value=”false”/>

<param name=”rtp-autofix-timing” value=”false”/>

<param name=”caller-id-in-from” value=”true”/>

</gateway>

第三步,A服务器到B服务器走5080端口,即 使用external, 如果走5060会提示IP,ACL不允许

freeswitch vpn方案

11.30.2012, freeswitch vpn方案已关闭评论, freeswitch, by .

来自freswitch-cn群内

 

昆山+戴晓亮(272966) 16:15:01

现在电信的网络对sip协议的封杀已经不多了,但是不是没有,我就遇到过
还有客户很多使用便宜的企业接入有,有接入人数限制,怎么解决这些问题呢?


我使用了tplink 6120路由器做服务端,客户那里装tplink r400路由器,使用ipsec vpn隧道,客户的ip电话机直接设服务器的内外ip。
已商业运用,tplink的企业级路由器还是可以的,给大家一下借鉴

昆山+戴晓亮(272966) 16:16:11

用这个方法所以问题都解决了,我还能直接连到电话机升级软件