最近老板的活大部分干完了,大概总结一下。

一、主要内容

老师给的活主要分为四个部分:

  1. 修改FreeSwitch绑定的IP和端口,这个情况主要是用在多网卡的服务器上。因为FreeSwitch运行的时候默认会绑定某一个IP地址,但是默认绑定的地址可能不是我们想要的IP,于是就有了绑定IP的控制台命令。端口

  2. 用户管理,包括用户的增、删、改、查。

  3. 呼叫转移规则,包括遇忙转移、无条件转移、无应答转移以及热线电话。

  4. 会议管理,包括会议的增、删、改、查。改的部分只做了改密码,而且会议开启之后才能改密码。

二、目前工作状况

2.1 FreeSwitch服务器IP的端口

修改FreeSwitch绑定的IP和端口是通过读写文件完成的。涉及到的文件有5个,包括

  • ${conf.dir}/vars.xml
  • ${conf.dir}/sip_profile/external.xml
  • ${conf.dir}/sip_profile/internal.xml

其中,vars.xml中需要修改一个参数

<X-PRE-PROCESS cmd="set" data="domain=$${local_ip_v4}"/>

external.xml需要修改两个参数

<param name="rtp-ip" value="$${local_ip_v4}"/>
<param name="sip-ip" value="$${local_ip_v4}"/>

internal.xml需要改的参数与externaml.xml文件改的一样

<param name="rtp-ip" value="$${local_ip_v4}"/>
<param name="sip-ip" value="$${local_ip_v4}"/>

如果改一次IP就得把3个文件读取然后改完再重写,比较麻烦而且读写文件会影响服务器运行效率
师兄给的意见是在vars.xml中添加server_bind_ip这个全局变量,然后将上面的5个参数的值置为server_bind_ip,之后修改IP只需要改server_bind_ip这个值就可以

但是老师认为不能让管理人员去修改xml文档,因此我又加上了一个新的全局参数ip_changed,用于查看IP是否改过,server_bind_ip这个参数是否添加过,如果添加过只需改一下server_nbbind_ip参数即可,但是如果没有添加过,则需要改上述3个文件以及添加server_bind_ip参数

修改端口就简单很多,只需要修改vars.xml中的
<X-PRE-PROCESS cmd="set" data="internal_sip_port=5060"/>
即可。而至于修改静态路由则等服务器对接之后再进行,综合之前所看到的资料,应该是修改${conf.dirs}/dialplan/default.xml即可

2.2 用户信息管理

用户信息管理主要包括增、删、改、查

增加用户只需要往${conf.dir}/directory/default目录下添加以用户ID命名的xml文件,此xml文件的内容有模版,然后修改其中的三个参数password,priority,forced_released_call。其中forced_released_call是可选的,默认为true,其他的默认,之后再“reloadxml”-重新加载一下xml

删除用户方面,只需要删除上述目录下用户ID对应的xml文档

修改用户信息方面,与增加用户类似,只能修改三个参数password,priority,forced_released_call。修改${conf.dir}/directory/default目录下用户ID相同的xml文档,读取文档,修改之后再重新写入即可

查询用户信息则简单得多,FreeSwitch则已经提供了查询所有用户信息的API。但是我们查询用户也需要针对某一个特定用户的信息查询,其次FreeSwitch提供的查询API没有给出用户密码等级等相关信息。因此有两个工作,一个是针对查询所有用户信息API进行修改,增加密码等级等信息,二是增加对于特定ID查询用户信息。所需要的工作不多,源代码中提供了用户信息查询的函数,直接调用就能得到所需的信息。

2.3 呼叫转移规则

设置呼叫转移规则则包括四个方面:

  • 无条件转移
  • 遇忙转移
  • 无应答转移
  • 热线电话

这4个方面都包括四个小方面:增、删、改、查。增和改其实都是一个命令,所以简化之下就只有三个方面,且这四个方面只需要一个命令即可。

  • 增:db insert/${domain}-${cmd}/${user_id}/${transfer_id}
  • 删:db delete/${domain}-${cmd}/${user_id}/${transfer_id}
  • 查:db select/${domain}-${cmd}/${user_id}

其中,${domain}是服务的IP,${user_id}是设置转移规则的用户,${tranfer_id}是设置转移规则的目标用户,${cmd}为字符串,各规则不一,对应如下:

  • 无条件转移 -> cfwdn
  • 遇忙转移 -> cfwdb
  • 无应答转移 -> cfwdna
  • 热线电话 -> hotline

至此,呼叫规则转移设置完毕

2.4 会议室管理

会议室管理方面则为最难的一部分。

老板的设想是预先设定会议,号码以及密码都设置好,之后参加会议的人直接打电话就可以。但是会议目前的流程是电话号码可以设定,密码也可以设置,但是这是一个总体规则,对于所有会议都使用,而且有的会议室号码不用预约也可以使用,和设想流程刚好相反。

在查阅了dialplan的相关资料之后找到了解决方法,FreeSwitch是根据dialplan中的default.xml配置来进行通话的。每一个<extension>都是一个配置,FreeSwitch从上到下进行扫描匹配,成功匹配到第一个之后就不再进行扫描。因此,只需要往default.xml中添加一个<extension>,匹配destination_number,然后在<action>中做出<answer>以及conference动作就可以。不过也需要对文件进行读取以及重新写入,需要对资源进行一定消耗。

删除会议方面不难,也是需要对文件进行读写,删除该会议的<extension>就可以删除该会议

其他的控制台命令如修改会议密码和查询所有会议,FreeSwitch都有提供的控制台命令,自己就无需再做了

三、总结

这个项目从3月10号开始,前前后后一共花了40天左右做完,目前为止,大块头以及有难度的部分已经做完,剩下的边边角角的工作还需要跟老师商量之后很快也可以搞定,这个项目可以说告一段落了。

在此期间,其实有很大一部分时间是自己休闲,并不是所有时间都在做,所以实际上的时间可能不到一个月。现在也是研一,平时也得上课,所以没有全部时间放在上面也很正常。其次,这个服务器是C语言写的,而C语言已经很久没有写过了,进度慢也正常。

但是实际上整个项目期间,除了这个项目之外我其他的东西都没有做,算法、课程还有网络方面都拉下了,至于之前的网络也没有好好学。其次,Android也很久没有动过了,自从大四之后就没有看过相关的知识,Android版本已经过了两三个大版本,有很多新的东西需要学习,而且已经很久没写过相关的项目,手也已经生了。

近期项目大部分已经结束了,也要开始继续算法,网络以及课程的学习。这也是简书的第一篇文章,写作的习惯也要开始慢慢养成。

撸起袖子加油干!

于2017年4月23号晚11点