一、安装FreeSwitch系统
FreeSwitch本身是跨平台的,作为学习,此处使用windows安装方式,点击下载windows版本的安装包,进行傻瓜式安装,安装后目录结构如下:
其中各文件夹和文件的说明如下:
cert | 证书密钥目录 |
conf | 配置文件目录 |
db | 默认的FreeSwitch数据库文件目录,数据库格式为sqlite3 |
fonts | 字体文件目录 |
grammar | 语法文件目录,用于ASR |
htdocs | httpServer根目录 |
images | 图片目录 |
libmariadb_plugin | 存放与数据库连接相关的插件 |
log | 日志目录 |
mod | 可加装模块目录 |
recordings | 录音文件目录 |
run | 运行时目录,存放运行时PID |
scripts | 嵌入式语言的脚本默认目录 |
sounds | 声音文件目录 |
storage | 语音留言的录音文件目录 |
FreeSwitchConsole.exe | FreeSwitch的控制台程序,只有运行该程序才能启动FreeSwitch |
fs_cli.exe | 用于控制FreeSwitch的客户端 |
二、启动FreeSwitch
以管理员身份运行FreeSwitchConsole.exe控制台,启动成功后界面如下,SIP客户端在连接到FreeSwitch后,相关操作的日志会在控制台打印,可用于排错处理。
三、安装Sip客户端软件并连接FreeSwitch
常用的SIP软电话软件有X-lite、zoiper、MicroSIP等,推荐使用MicroSIP,自行百度下载。以MicroSIP-3.21.3.exe客户端为例连接FreeSwitch,界面如下:
1001是默认配置的用户分机号,密码默认为1234,连接后显示状态为在线,此时拨打9664听到保持音乐,到此证明FreeSwitch安装成功。
四、FreeSwitch配置说明
FreeSwitch 配置文件默认放在conf/下,它由一系列XML 配置文件组成。最顶层的文件是 freeswitch.xml,系统启动时它依次装入其他一些XML文件并最终组成一个大的XML文件。
基本的目录结构和主要配置文件如下所示:
1.配置分机号:FreeSwitch默认设置了20个用户(1000 ~1019 ),如果需要新增,则需进行如下操作:
- 新增用户配置:在conf/directory/default/目录新建一个xxx.xml文件。
- 修改拨号计划:修改dialpan/default.xml文件,使其它用户可以呼叫它。
- 重新加载配置:重启FreeSwitch控制台或者执行reloadxml命令。
2.配置SIP网关:如果拥有某个运营商提供的SIP账号,就可以通过配置SIP网关来拨打外部电话,该账号对应的设备设备称为SIP网关(此时FreeSwitch就相当于该设备的一个sip客户端)。新增网关只需要在conf/sip_profiles/external/中创建一个针对SIP网关的xml文件,并配置SIP服务器地址、账号、密码即可。
3.配置出局字冠:SIP网关配置好后就可以拨打外部电话,但是在使用分机号拨打外部前需要一个前缀字冠来区分是要呼叫外部电话,需要创建或者编辑一个拨号计划conf/dialplan/default/call_out.xml。
4.电话呼入处理配置:如果SIP网关支持DID(对内直接呼入),就可以通过配置conf/dialplan/public/my_did.xml来将呼入指定到具体的内部分机号。
五、FreeSwitchAPI Commands
FreeSwitch提供了一些内部命令Commands,使用这些命令可以用于发起呼叫、个性化配置等。这些命令可以通过FreeSwitch控制台输入,也可以通过各种嵌入式脚本、Event Socket(fs_cli)、HTTP RPC来输入。
要查询命令的有哪些和如何使用,可以使用FreeSwitchAPI的help帮助命令,它可以列出所有命令使用方式,命令格式的规定如下:
1.用尖括号(>)括起来的表示是要输入的参数。
2.用方括号([])括起来的则表示为可选项。
3.用竖线(|)分开的参数列表表示“或”的关系,即只能选其一。
使用时参考官方API说明文档。常用的命令如下:
<result row_count="219"> <row row_id="1"> <命令名称>...</命令名称> <描述>关机</描述> <语法格式/> <模块>mod_commands</模块> </row> <row row_id="2"> <命令名称>acl</命令名称> <描述>将ip与acl列表进行比较</描述> <语法格式><ip><list_name></语法格式> <模块>mod_commands</模块> </row> <row row_id="3"> <命令名称>alias</命令名称> <描述>别名</描述> <语法格式>[add|stickyadd] <alias> <command> | del [<alias>|*]</语法格式> <模块>mod_commands</模块> </row> <row row_id="4"> <命令名称>av</命令名称> <描述>AV通用命令</描述> <语法格式>debug [on|off] | show <formats | codecs></语法格式> <模块>mod_av</模块> </row> <row row_id="5"> <命令名称>banner</命令名称> <描述>返回系统banner</描述> <语法格式/> <模块>mod_commands</模块> </row> <row row_id="6"> <命令名称>bg_spawn</命令名称> <描述>在后台执行生成命令</描述> <语法格式><command></语法格式> <模块>mod_commands</模块> </row> <row row_id="7"> <命令名称>bg_system</命令名称> <描述>在后台执行系统命令</描述> <语法格式><command></语法格式> <模块>mod_commands</模块> </row> <row row_id="8"> <命令名称>bgapi</命令名称> <描述>在线程中执行api命令</描述> <语法格式><command>[ <arg>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="9"> <命令名称>break</命令名称> <描述>uuid_中断</描述> <语法格式><uuid> [all]</语法格式> <模块>mod_commands</模块> </row> <row row_id="10"> <命令名称>cdr_csv</命令名称> <描述>cdr_csv控件</描述> <语法格式>parameters</语法格式> <模块>mod_cdr_csv</模块> </row> <row row_id="11"> <命令名称>chat</命令名称> <描述>聊天</描述> <语法格式><proto>|<from>|<to>|<message>|[<content-type>]</语法格式> <模块>mod_dptools</模块> </row> <row row_id="12"> <命令名称>coalesce</命令名称> <描述>返回第一个非空参数</描述> <语法格式>[^^<delim>]<value1>,<value2>,...</语法格式> <模块>mod_commands</模块> </row> <row row_id="13"> <命令名称>complete</命令名称> <描述>完成</描述> <语法格式>add <word>|del [<word>|*]</语法格式> <模块>mod_commands</模块> </row> <row row_id="14"> <命令名称>cond</命令名称> <描述>评估条件</描述> <语法格式><expr> ? <true val> : <false val></语法格式> <模块>mod_commands</模块> </row> <row row_id="15"> <命令名称>conference</命令名称> <描述>会议模块命令</描述> <语法格式/> <模块>mod_conference</模块> </row> <row row_id="16"> <命令名称>console</命令名称> <描述>控制台</描述> <语法格式>loglevel [level]|colorize [on|toggle|off]|uuid [on|toggle|off]|json [on|toggle|off]</语法格式> <模块>mod_console</模块> </row> <row row_id="17"> <命令名称>create_uuid</命令名称> <描述>创建uuid</描述> <语法格式><uuid> <other_uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="18"> <命令名称>db</命令名称> <描述>db数据库操作</描述> <语法格式>[insert|delete|select|exists|count|list]/<realm>/<key>/<value></语法格式> <模块>mod_db</模块> </row> <row row_id="19"> <命令名称>db_cache</命令名称> <描述>管理数据库缓存</描述> <语法格式>status</语法格式> <模块>mod_commands</模块> </row> <row row_id="20"> <命令名称>domain_data</命令名称> <描述>查找域数据</描述> <语法格式><domain> [var|param|attr] <name></语法格式> <模块>mod_commands</模块> </row> <row row_id="21"> <命令名称>domain_exists</命令名称> <描述>检查域是否存在</描述> <语法格式><domain></语法格式> <模块>mod_commands</模块> </row> <row row_id="22"> <命令名称>echo</命令名称> <描述>Echo</描述> <语法格式><data></语法格式> <模块>mod_commands</模块> </row> <row row_id="23"> <命令名称>enum</命令名称> <描述>ENUM</描述> <语法格式/> <模块>mod_enum</模块> </row> <row row_id="24"> <命令名称>enum_auto</命令名称> <描述>ENUM</描述> <语法格式/> <模块>mod_enum</模块> </row> <row row_id="25"> <命令名称>escape</命令名称> <描述>转义字符串</描述> <语法格式><data></语法格式> <模块>mod_commands</模块> </row> <row row_id="26"> <命令名称>eval</命令名称> <描述>eval (noop)</描述> <语法格式>[uuid:<uuid> ]<expression></语法格式> <模块>mod_commands</模块> </row> <row row_id="27"> <命令名称>event_channel_broadcast</命令名称> <描述>广播</描述> <语法格式><channel> <json></语法格式> <模块>mod_commands</模块> </row> <row row_id="28"> <命令名称>event_sink</命令名称> <描述>event_sink</描述> <语法格式><web data></语法格式> <模块>mod_event_socket</模块> </row> <row row_id="29"> <命令名称>expand</命令名称> <描述>执行带有变量扩展的api</描述> <语法格式>[uuid:<uuid> ]<cmd> <args></语法格式> <模块>mod_commands</模块> </row> <row row_id="30"> <命令名称>expr</命令名称> <描述>评估表达式</描述> <语法格式><expr></语法格式> <模块>mod_expr</模块> </row> <row row_id="31"> <命令名称>fifo</命令名称> <描述>返回有关fifo的数据</描述> <语法格式>list|list_verbose|count|debug|status|has_outbound|importance [<fifo name>]|reparse [del_all]</语法格式> <模块>mod_fifo</模块> </row> <row row_id="32"> <命令名称>fifo_add_outbound</命令名称> <描述>将出站成员添加到fifo</描述> <语法格式><node> <url> [<priority>]</语法格式> <模块>mod_fifo</模块> </row> <row row_id="33"> <命令名称>fifo_check_bridge</命令名称> <描述>检查uuid是否在网桥中</描述> <语法格式><uuid>|<outbound_id></语法格式> <模块>mod_fifo</模块> </row> <row row_id="34"> <命令名称>fifo_member</命令名称> <描述>将成员添加到fifo</描述> <语法格式>[add <fifo_name> <originate_string> [<simo_count>] [<timeout>] [<lag>] [<expires>] [<taking_calls>] | del <fifo_name> <originate_string>]</语法格式> <模块>mod_fifo</模块> </row> <row row_id="35"> <命令名称>file_exists</命令名称> <描述>检查服务器上是否存在文件</描述> <语法格式><file></语法格式> <模块>mod_commands</模块> </row> <row row_id="36"> <命令名称>find_user_xml</命令名称> <描述>查找用户</描述> <语法格式><key> <user> <domain></语法格式> <模块>mod_commands</模块> </row> <row row_id="37"> <命令名称>fsctl</命令名称> <描述>FS控制消息</描述> <语法格式>[recover|send_sighup|hupall|pause [inbound|outbound]|resume [inbound|outbound]|shutdown [cancel|elegant|asap|now|restart]|sps|sps_peak_reset|sync_clock|sync_clock_when_idle|reclaim_mem|max_sessions|min_dtmf_duration [num]|max_dtmf_duration [num]|default_dtmf_duration [num]|min_idle_cpu|loglevel [level]|debug_level [level]|mdns_resolve [enable|disable]]</语法格式> <模块>mod_commands</模块> </row> <row row_id="38"> <命令名称>getcputime</命令名称> <描述>获取CPU时间(以毫秒为单位)(user,kernel)</描述> <语法格式>[reset]</语法格式> <模块>mod_commands</模块> </row> <row row_id="39"> <命令名称>getenv</命令名称> <描述>获取环境</描述> <语法格式><name></语法格式> <模块>mod_commands</模块> </row> <row row_id="40"> <命令名称>gethost</命令名称> <描述>按主机名获取主机</描述> <语法格式/> <模块>mod_commands</模块> </row> <row row_id="41"> <命令名称>global_getvar</命令名称> <描述>获取全局变量</描述> <语法格式><var></语法格式> <模块>mod_commands</模块> </row> <row row_id="42"> <命令名称>global_setvar</命令名称> <描述>设置全局变量</描述> <语法格式><var>=<value> [=<value2>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="43"> <命令名称>group</命令名称> <描述>组的[insert|delete|call]</描述> <语法格式>[insert|delete|call]:<group name>:<url></语法格式> <模块>mod_db</模块> </row> <row row_id="44"> <命令名称>group_call</命令名称> <描述>生成拨号字符串以呼叫组</描述> <语法格式><group>[@<domain>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="45"> <命令名称>hash</命令名称> <描述>hash get/set</描述> <语法格式>[insert|delete|select]/<realm>/<key>/<value></语法格式> <模块>mod_hash</模块> </row> <row row_id="46"> <命令名称>hash_dump</命令名称> <描述>转储hash/limit_hash数据(用于同步)</描述> <语法格式>all|limit|db [<realm>]</语法格式> <模块>mod_hash</模块> </row> <row row_id="47"> <命令名称>hash_remote</命令名称> <描述>hash remote</描述> <语法格式>list|kill [name]|rescan</语法格式> <模块>mod_hash</模块> </row> <row row_id="48"> <命令名称>help</命令名称> <描述>显示所有api命令的帮助</描述> <语法格式/> <模块>mod_commands</模块> </row> <row row_id="49"> <命令名称>host_lookup</命令名称> <描述>查找主机</描述> <语法格式><hostname></语法格式> <模块>mod_commands</模块> </row> <row row_id="50"> <命令名称>hostname</命令名称> <描述>返回系统主机名</描述> <语法格式/> <模块>mod_commands</模块> </row> <row row_id="51"> <命令名称>httapi</命令名称> <描述>HT-TAPI超文本电话API</描述> <语法格式>[debug_on|debug_off]</语法格式> <模块>mod_httapi</模块> </row> <row row_id="52"> <命令名称>hupall</命令名称> <描述>hupall</描述> <语法格式><cause> [<var> <value>] [<var2> <value2>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="53"> <命令名称>in_group</命令名称> <描述>确定用户是否在组中</描述> <语法格式><user>[@<domain>] <group_name></语法格式> <模块>mod_commands</模块> </row> <row row_id="54"> <命令名称>interface_ip</命令名称> <描述>返回接口的主IP</描述> <语法格式>[auto|ipv4|ipv6] <ifname></语法格式> <模块>mod_commands</模块> </row> <row row_id="55"> <命令名称>is_lan_addr</命令名称> <描述>查看ip是否为局域网地址</描述> <语法格式><ip></语法格式> <模块>mod_commands</模块> </row> <row row_id="56"> <命令名称>json</命令名称> <描述>JSON API</描述> <语法格式>JSON</语法格式> <模块>mod_commands</模块> </row> <row row_id="57"> <命令名称>limit_hash_usage</命令名称> <描述>不推荐:获取有限资源的使用计数</描述> <语法格式><realm> <id></语法格式> <模块>mod_commands</模块> </row> <row row_id="58"> <命令名称>limit_interval_reset</命令名称> <描述>重置有限资源的间隔计数器</描述> <语法格式><backend> <realm> <resource></语法格式> <模块>mod_commands</模块> </row> <row row_id="59"> <命令名称>limit_reset</命令名称> <描述>重置限制后端的计数器</描述> <语法格式><backend></语法格式> <模块>mod_commands</模块> </row> <row row_id="60"> <命令名称>limit_status</命令名称> <描述>获取限制后端的状态</描述> <语法格式><backend></语法格式> <模块>mod_commands</模块> </row> <row row_id="61"> <命令名称>limit_usage</命令名称> <描述>获取有限资源的使用计数</描述> <语法格式><backend> <realm> <id></语法格式> <模块>mod_commands</模块> </row> <row row_id="62"> <命令名称>list_users</命令名称> <描述>列出在目录中配置的用户</描述> <语法格式>[group <group>] [domain <domain>] [user <user>] [context <context>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="63"> <命令名称>load</命令名称> <描述>加载模块</描述> <语法格式><mod_name></语法格式> <模块>mod_commands</模块> </row> <row row_id="64"> <命令名称>local_stream</命令名称> <描述>管理本地流</描述> <语法格式><show|start|reload|stop|hup> <local_stream_name></语法格式> <模块>mod_local_stream</模块> </row> <row row_id="65"> <命令名称>log</命令名称> <描述>Log</描述> <语法格式><level> <message></语法格式> <模块>mod_commands</模块> </row> <row row_id="66"> <命令名称>lua</命令名称> <描述>将脚本作为api函数运行</描述> <语法格式><script></语法格式> <模块>mod_lua</模块> </row> <row row_id="67"> <命令名称>luarun</命令名称> <描述>运行脚本</描述> <语法格式><script></语法格式> <模块>mod_lua</模块> </row> <row row_id="68"> <命令名称>md5</命令名称> <描述>返回md5 hash</描述> <语法格式><data></语法格式> <模块>mod_commands</模块> </row> <row row_id="69"> <命令名称>memory</命令名称> <描述>内存使用情况统计信息</描述> <语法格式>memory</语法格式> <模块>mod_commands</模块> </row> <row row_id="70"> <命令名称>module_exists</命令名称> <描述>检查模块是否存在</描述> <语法格式><module></语法格式> <模块>mod_commands</模块> </row> <row row_id="71"> <命令名称>msleep</命令名称> <描述>睡眠N毫秒</描述> <语法格式><milliseconds></语法格式> <模块>mod_commands</模块> </row> <row row_id="72"> <命令名称>msrp</命令名称> <描述>MSRP Functions</描述> <语法格式>debug <on|off>|restart</语法格式> <模块>mod_commands</模块> </row> <row row_id="73"> <命令名称>nat_map</命令名称> <描述>管理 NAT</描述> <语法格式>[status|republish|reinit] | [add|del] <port> [tcp|udp] [static]</语法格式> <模块>mod_commands</模块> </row> <row row_id="74"> <命令名称>opus_debug</命令名称> <描述>设置OPUS调试</描述> <语法格式><on|off></语法格式> <模块>mod_opus</模块> </row> <row row_id="75"> <命令名称>originate</命令名称> <描述>发起呼叫</描述> <语法格式><call url> <exten>|&<application_name>(<app_args>) [<dialplan>] [<context>] [<cid_name>] [<cid_num>] [<timeout_sec>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="76"> <命令名称>page</命令名称> <描述>将文件作为页面发送</描述> <语法格式>(var1=val1,var2=val2)<var1=val1,var2=val2><chan1>[:_:<chanN>]</语法格式> <模块>mod_dptools</模块> </row> <row row_id="77"> <命令名称>pause</命令名称> <描述>暂停频道上的媒体</描述> <语法格式><uuid> <on|off></语法格式> <模块>mod_commands</模块> </row> <row row_id="78"> <命令名称>pool_stats</命令名称> <描述>核心池内存使用情况</描述> <语法格式>Core pool memory usage.</语法格式> <模块>mod_commands</模块> </row> <row row_id="79"> <命令名称>presence</命令名称> <描述>presence</描述> <语法格式>[in|out] <user> <rpid> <message></语法格式> <模块>mod_dptools</模块> </row> <row row_id="80"> <命令名称>quote_shell_arg</命令名称> <描述>在shell命令行中引用/转义字符串</描述> <语法格式><data></语法格式> <模块>mod_commands</模块> </row> <row row_id="81"> <命令名称>regex</命令名称> <描述>评估正则表达式</描述> <语法格式><data>|<pattern>[|<subst string>][n|b]</语法格式> <模块>mod_commands</模块> </row> <row row_id="82"> <命令名称>reload</命令名称> <描述>重载 module</描述> <语法格式>[-f] <mod_name></语法格式> <模块>mod_commands</模块> </row> <row row_id="83"> <命令名称>reloadacl</命令名称> <描述>重载 XML</描述> <语法格式/> <模块>mod_commands</模块> </row> <row row_id="84"> <命令名称>reloadxml</命令名称> <描述>重载 XML</描述> <语法格式/> <模块>mod_commands</模块> </row> <row row_id="85"> <命令名称>replace</命令名称> <描述>替换字符串</描述> <语法格式><data>|<string1>|<string2></语法格式> <模块>mod_commands</模块> </row> <row row_id="86"> <命令名称>sched_api</命令名称> <描述>调度一个api命令</描述> <语法格式>[+@]<time> <group_name> <command_string>[&]</语法格式> <模块>mod_commands</模块> </row> <row row_id="87"> <命令名称>sched_broadcast</命令名称> <描述>为正在运行的呼叫调度广播事件</描述> <语法格式>[[+]<time>|@time] <uuid> <path> [aleg|bleg|both]</语法格式> <模块>mod_commands</模块> </row> <row row_id="88"> <命令名称>sched_del</命令名称> <描述>删除计划任务</描述> <语法格式><task_id>|<group_id></语法格式> <模块>mod_commands</模块> </row> <row row_id="89"> <命令名称>sched_hangup</命令名称> <描述>调度正在进行的挂断电话</描述> <语法格式>[+]<time> <uuid> [<cause>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="90"> <命令名称>sched_transfer</命令名称> <描述>为正在进行的呼叫调度转接</描述> <语法格式>[+]<time> <uuid> <extension> [<dialplan>] [<context>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="91"> <命令名称>show</命令名称> <描述>显示各种报告</描述> <语法格式>codec|endpoint|application|api|dialplan|file|timer|calls [count]|channels [count|like <match string>]|calls|detailed_calls|bridged_calls|detailed_bridged_calls|aliases|complete|chat|management|modules|nat_map|say|interfaces|interface_types|tasks|limits|status</语法格式> <模块>mod_commands</模块> </row> <row row_id="92"> <命令名称>shutdown</命令名称> <描述>关机</描述> <语法格式/> <模块>mod_commands</模块> </row> <row row_id="93"> <命令名称>signalwire</命令名称> <描述>SignalWire API</描述> <语法格式>token | token-reset | adoption | adopted | reload | update | debug <level> | kslog <on|off|logfile e.g. /tmp/ks.log></语法格式> <模块>mod_signalwire</模块> </row> <row row_id="94"> <命令名称>sndfile_debug</命令名称> <描述>调试sndfile集</描述> <语法格式><on|off></语法格式> <模块>mod_sndfile</模块> </row> <row row_id="95"> <命令名称>sofia</命令名称> <描述>Sofia Controls</描述> <语法格式><cmd> <args></语法格式> <模块>mod_sofia</模块> </row> <row row_id="96"> <命令名称>sofia_contact</命令名称> <描述>Sofia Contacts</描述> <语法格式>[profile/]<user>@<domain></语法格式> <模块>mod_sofia</模块> </row> <row row_id="97"> <命令名称>sofia_count_reg</命令名称> <描述>Count Sofia registration</描述> <语法格式>[profile/]<user>@<domain></语法格式> <模块>mod_sofia</模块> </row> <row row_id="98"> <命令名称>sofia_dig</命令名称> <描述>SIP DIG</描述> <语法格式><url></语法格式> <模块>mod_sofia</模块> </row> <row row_id="99"> <命令名称>sofia_gateway_data</命令名称> <描述>从sofia网关获取数据</描述> <语法格式><gateway_name> [ivar|ovar|var] <name></语法格式> <模块>mod_sofia</模块> </row> <row row_id="100"> <命令名称>sofia_presence_data</命令名称> <描述>Sofia Presence Data</描述> <语法格式>[list|status|rpid|user_agent] [profile/]<user>@domain</语法格式> <模块>mod_sofia</模块> </row> <row row_id="101"> <命令名称>sofia_username_of</命令名称> <描述>Sofia Username Lookup</描述> <语法格式>[profile/]<user>@<domain></语法格式> <模块>mod_sofia</模块> </row> <row row_id="102"> <命令名称>spandsp_start_tone_detect</命令名称> <描述>开始有节奏的背景音检测</描述> <语法格式><uuid> <name></语法格式> <模块>mod_spandsp</模块> </row> <row row_id="103"> <命令名称>spandsp_stop_tone_detect</命令名称> <描述>停止有节奏的背景音检测</描述> <语法格式><uuid></语法格式> <模块>mod_spandsp</模块> </row> <row row_id="104"> <命令名称>spawn</命令名称> <描述>执行生成命令而不捕获其输出</描述> <语法格式><command></语法格式> <模块>mod_commands</模块> </row> <row row_id="105"> <命令名称>spawn_stream</命令名称> <描述>执行生成命令并捕获其输出</描述> <语法格式><command></语法格式> <模块>mod_commands</模块> </row> <row row_id="106"> <命令名称>sql_escape</命令名称> <描述>转义字符串以防止sql注入</描述> <语法格式><string></语法格式> <模块>mod_commands</模块> </row> <row row_id="107"> <命令名称>start_tdd_detect</命令名称> <描述>启动背景tdd检测</描述> <语法格式><uuid></语法格式> <模块>mod_spandsp</模块> </row> <row row_id="108"> <命令名称>status</命令名称> <描述>显示当前状态</描述> <语法格式/> <模块>mod_commands</模块> </row> <row row_id="109"> <命令名称>stop_tdd_detect</命令名称> <描述>停止背景tdd检测</描述> <语法格式><uuid></语法格式> <模块>mod_spandsp</模块> </row> <row row_id="110"> <命令名称>strepoch</命令名称> <描述>将日期字符串转换为历元时间</描述> <语法格式><string></语法格式> <模块>mod_dptools</模块> </row> <row row_id="111"> <命令名称>strftime</命令名称> <描述>strftime</描述> <语法格式><format_string></语法格式> <模块>mod_dptools</模块> </row> <row row_id="112"> <命令名称>strftime_tz</命令名称> <描述>显示时区的格式化时间</描述> <语法格式><timezone_name> [<epoch>|][format string]</语法格式> <模块>mod_commands</模块> </row> <row row_id="113"> <命令名称>strmicroepoch</命令名称> <描述>将日期字符串转换为微小时间</描述> <语法格式><string></语法格式> <模块>mod_dptools</模块> </row> <row row_id="114"> <命令名称>stun</命令名称> <描述>执行STUN查找</描述> <语法格式><stun_server>[:port] [<source_ip>[:<source_port]]</语法格式> <模块>mod_commands</模块> </row> <row row_id="115"> <命令名称>switchname</命令名称> <描述>返回交换机名称</描述> <语法格式/> <模块>mod_commands</模块> </row> <row row_id="116"> <命令名称>system</命令名称> <描述>执行系统命令</描述> <语法格式><command></语法格式> <模块>mod_commands</模块> </row> <row row_id="117"> <命令名称>time_test</命令名称> <描述>显示时间抖动</描述> <语法格式><mss> [count]</语法格式> <模块>mod_commands</模块> </row> <row row_id="118"> <命令名称>timer_test</命令名称> <描述>测试FS计时器</描述> <语法格式><10|20|40|60|120> [<1..200>] [<timer_name>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="119"> <命令名称>tolower</命令名称> <描述>小写字符串</描述> <语法格式><string></语法格式> <模块>mod_commands</模块> </row> <row row_id="120"> <命令名称>tone_detect</命令名称> <描述>在通道上启动音调检测</描述> <语法格式><uuid> <key> <tone_spec> [<flags> <timeout> <app> <args> <hits>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="121"> <命令名称>toupper</命令名称> <描述>大写字符串</描述> <语法格式><string></语法格式> <模块>mod_commands</模块> </row> <row row_id="122"> <命令名称>unload</命令名称> <描述>卸载 module</描述> <语法格式>[-f] <mod_name></语法格式> <模块>mod_commands</模块> </row> <row row_id="123"> <命令名称>unsched_api</命令名称> <描述>取消api命令计划</描述> <语法格式><task_id></语法格式> <模块>mod_commands</模块> </row> <row row_id="124"> <命令名称>uptime</命令名称> <描述>显示正常运行时间</描述> <语法格式>[us|ms|s|m|h|d|microseconds|milliseconds|seconds|minutes|hours|days]</语法格式> <模块>mod_commands</模块> </row> <row row_id="125"> <命令名称>url_decode</命令名称> <描述>Url解码字符串</描述> <语法格式><string></语法格式> <模块>mod_commands</模块> </row> <row row_id="126"> <命令名称>url_encode</命令名称> <描述>Url编码字符串</描述> <语法格式><string></语法格式> <模块>mod_commands</模块> </row> <row row_id="127"> <命令名称>user_data</命令名称> <描述>查询用户数据</描述> <语法格式><user>@<domain> [var|param|attr] <name></语法格式> <模块>mod_commands</模块> </row> <row row_id="128"> <命令名称>user_exists</命令名称> <描述>查找用户是否存在</描述> <语法格式><key> <user> <domain></语法格式> <模块>mod_commands</模块> </row> <row row_id="129"> <命令名称>uuid_answer</命令名称> <描述>应答</描述> <语法格式><uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="130"> <命令名称>uuid_audio</命令名称> <描述>uuid_audio</描述> <语法格式><uuid> [start [read|write] [mute|level <level>]|stop]</语法格式> <模块>mod_commands</模块> </row> <row row_id="131"> <命令名称>uuid_break</命令名称> <描述>中断发送到频道的媒体</描述> <语法格式><uuid> [all]</语法格式> <模块>mod_commands</模块> </row> <row row_id="132"> <命令名称>uuid_bridge</命令名称> <描述>桥接呼叫</描述> <语法格式/> <模块>mod_commands</模块> </row> <row row_id="133"> <命令名称>uuid_broadcast</命令名称> <描述>执行拨号计划应用程序</描述> <语法格式><uuid> <path> [aleg|bleg|holdb|both]</语法格式> <模块>mod_commands</模块> </row> <row row_id="134"> <命令名称>uuid_buglist</命令名称> <描述>列出会话中的媒体错误</描述> <语法格式><uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="135"> <命令名称>uuid_capture_text</命令名称> <描述>开始/停止 capture_text</描述> <语法格式><uuid> <on|off></语法格式> <模块>mod_commands</模块> </row> <row row_id="136"> <命令名称>uuid_chat</命令名称> <描述>发送聊天信息</描述> <语法格式><uuid> <text></语法格式> <模块>mod_commands</模块> </row> <row row_id="137"> <命令名称>uuid_codec_debug</命令名称> <描述>向编解码器发送调试消息</描述> <语法格式><uuid> audio|video <level></语法格式> <模块>mod_commands</模块> </row> <row row_id="138"> <命令名称>uuid_codec_param</命令名称> <描述>向编解码器发送参数</描述> <语法格式><uuid> audio|video read|write <param> <val></语法格式> <模块>mod_commands</模块> </row> <row row_id="139"> <命令名称>uuid_debug_media</命令名称> <描述>调试media</描述> <语法格式><uuid> <read|write|both|vread|vwrite|vboth|all> <on|off></语法格式> <模块>mod_commands</模块> </row> <row row_id="140"> <命令名称>uuid_deflect</命令名称> <描述>发送deflect</描述> <语法格式><uuid> <uri></语法格式> <模块>mod_commands</模块> </row> <row row_id="141"> <命令名称>uuid_displace</命令名称> <描述>置换音频</描述> <语法格式><uuid> [start|stop] <path> [<limit>] [mux]</语法格式> <模块>mod_commands</模块> </row> <row row_id="142"> <命令名称>uuid_display</命令名称> <描述>更新手机显示</描述> <语法格式><uuid> <display></语法格式> <模块>mod_commands</模块> </row> <row row_id="143"> <命令名称>uuid_drop_dtmf</命令名称> <描述>删除所有DTMF或将其替换为掩码</描述> <语法格式><uuid> [on | off ] [ mask_digits <digits> | mask_file <file>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="144"> <命令名称>uuid_dual_transfer</命令名称> <描述>转移会话及其合作伙伴</描述> <语法格式><uuid> <A-dest-exten>[/<A-dialplan>][/<A-context>] <B-dest-exten>[/<B-dialplan>][/<B-context>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="145"> <命令名称>uuid_dump</命令名称> <描述>转储会话变量</描述> <语法格式><uuid> [format]</语法格式> <模块>mod_commands</模块> </row> <row row_id="146"> <命令名称>uuid_early_ok</命令名称> <描述>停止忽略早期媒体</描述> <语法格式><uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="147"> <命令名称>uuid_exists</命令名称> <描述>检查是否存在uuid</描述> <语法格式><uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="148"> <命令名称>uuid_fileman</命令名称> <描述>管理会话音频</描述> <语法格式><uuid> <cmd>:<val></语法格式> <模块>mod_commands</模块> </row> <row row_id="149"> <命令名称>uuid_flush_dtmf</命令名称> <描述>在给定的uuid上刷新dtmf</描述> <语法格式><uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="150"> <命令名称>uuid_getvar</命令名称> <描述>从通道中获取变量</描述> <语法格式><uuid> <var></语法格式> <模块>mod_commands</模块> </row> <row row_id="151"> <命令名称>uuid_hold</命令名称> <描述>暂停通话</描述> <语法格式>[off|toggle] <uuid> [<display>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="152"> <命令名称>uuid_jitterbuffer</命令名称> <描述>uuid_抖动缓冲区</描述> <语法格式><uuid> [0|<min_msec>[:<max_msec>]]</语法格式> <模块>mod_commands</模块> </row> <row row_id="153"> <命令名称>uuid_kill</命令名称> <描述>杀掉 channel</描述> <语法格式><uuid> [cause]</语法格式> <模块>mod_commands</模块> </row> <row row_id="154"> <命令名称>uuid_limit</命令名称> <描述>增加限制资源</描述> <语法格式><uuid> <backend> <realm> <resource> [<max>[/interval]] [number [dialplan [context]]]</语法格式> <模块>mod_commands</模块> </row> <row row_id="155"> <命令名称>uuid_limit_release</命令名称> <描述>释放限制资源</描述> <语法格式><uuid> <backend> [realm] [resource]</语法格式> <模块>mod_commands</模块> </row> <row row_id="156"> <命令名称>uuid_loglevel</命令名称> <描述>设置会话的日志级别</描述> <语法格式><uuid> <level></语法格式> <模块>mod_commands</模块> </row> <row row_id="157"> <命令名称>uuid_media</命令名称> <描述>重新邀请FS进入或退出媒体路径</描述> <语法格式>[off] <uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="158"> <命令名称>uuid_media_3p</命令名称> <描述>使用3pcc重新邀请FS进出媒体路径</描述> <语法格式>[off] <uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="159"> <命令名称>uuid_media_params</命令名称> <描述>更新远程视频参数</描述> <语法格式><uuid> <json></语法格式> <模块>mod_commands</模块> </row> <row row_id="160"> <命令名称>uuid_media_reneg</命令名称> <描述>媒体协商</描述> <语法格式><uuid>[ <codec_string>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="161"> <命令名称>uuid_msrp_send</命令名称> <描述>发送msrp文本</描述> <语法格式><msg></语法格式> <模块>mod_commands</模块> </row> <row row_id="162"> <命令名称>uuid_outgoing_answer</命令名称> <描述>应答传出通道</描述> <语法格式><uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="163"> <命令名称>uuid_park</命令名称> <描述>Park channel</描述> <语法格式><uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="164"> <命令名称>uuid_pause</命令名称> <描述>暂停频道上的媒体</描述> <语法格式><uuid> <on|off></语法格式> <模块>mod_commands</模块> </row> <row row_id="165"> <命令名称>uuid_phone_event</命令名称> <描述>向手机发送事件</描述> <语法格式><uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="166"> <命令名称>uuid_pre_answer</命令名称> <描述>pre_answer</描述> <语法格式><uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="167"> <命令名称>uuid_preprocess</命令名称> <描述>Pre-process Channel</描述> <语法格式><></语法格式> <模块>mod_commands</模块> </row> <row row_id="168"> <命令名称>uuid_record</命令名称> <描述>录制会话音频</描述> <语法格式><uuid> [start|stop|mask|unmask] <path> [<limit>] [<recording_vars>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="169"> <命令名称>uuid_recovery_refresh</命令名称> <描述>发送 recovery_refresh</描述> <语法格式><uuid> <uri></语法格式> <模块>mod_commands</模块> </row> <row row_id="170"> <命令名称>uuid_recv_dtmf</命令名称> <描述>接收dtmf数字</描述> <语法格式><uuid> <dtmf_data></语法格式> <模块>mod_commands</模块> </row> <row row_id="171"> <命令名称>uuid_redirect</命令名称> <描述>发送重定向</描述> <语法格式><uuid> <uri></语法格式> <模块>mod_commands</模块> </row> <row row_id="172"> <命令名称>uuid_ring_ready</命令名称> <描述>将铃声发送到频道</描述> <语法格式><uuid> [queued]</语法格式> <模块>mod_commands</模块> </row> <row row_id="173"> <命令名称>uuid_send_dtmf</命令名称> <描述>发送dtmf数字</描述> <语法格式><uuid> <dtmf_data></语法格式> <模块>mod_commands</模块> </row> <row row_id="174"> <命令名称>uuid_send_info</命令名称> <描述>将信息发送到端点</描述> <语法格式><uuid> [<mime_type> <mime_subtype>] <message></语法格式> <模块>mod_commands</模块> </row> <row row_id="175"> <命令名称>uuid_send_message</命令名称> <描述>向端点发送消息</描述> <语法格式><uuid> <message></语法格式> <模块>mod_commands</模块> </row> <row row_id="176"> <命令名称>uuid_send_tdd</命令名称> <描述>将tdd数据发送到uuid</描述> <语法格式><uuid> <text></语法格式> <模块>mod_spandsp</模块> </row> <row row_id="177"> <命令名称>uuid_send_text</命令名称> <描述>实时发送文本</描述> <语法格式><uuid> <text></语法格式> <模块>mod_commands</模块> </row> <row row_id="178"> <命令名称>uuid_session_heartbeat</命令名称> <描述>uuid_session_heartbeat</描述> <语法格式><uuid> [sched] [0|<seconds>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="179"> <命令名称>uuid_set_media_stats</命令名称> <描述>设置媒体统计信息</描述> <语法格式><uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="180"> <命令名称>uuid_setvar</命令名称> <描述>设置变量</描述> <语法格式><uuid> <var> [value]</语法格式> <模块>mod_commands</模块> </row> <row row_id="181"> <命令名称>uuid_setvar_multi</命令名称> <描述>设置多个变量</描述> <语法格式><uuid> <var>=<value>;<var>=<value>...</语法格式> <模块>mod_commands</模块> </row> <row row_id="182"> <命令名称>uuid_simplify</命令名称> <描述>尝试切断呼叫路径/参与的xfer</描述> <语法格式><uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="183"> <命令名称>uuid_transfer</命令名称> <描述>转移会话</描述> <语法格式><uuid> [-bleg|-both] <dest-exten> [<dialplan>] [<context>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="184"> <命令名称>uuid_video_bandwidth</命令名称> <描述>发送视频带宽</描述> <语法格式><uuid> <bitrate></语法格式> <模块>mod_commands</模块> </row> <row row_id="185"> <命令名称>uuid_video_bitrate</命令名称> <描述>发送视频比特率请求</描述> <语法格式><uuid> <bitrate></语法格式> <模块>mod_commands</模块> </row> <row row_id="186"> <命令名称>uuid_video_refresh</命令名称> <描述>发送视频刷新</描述> <语法格式><uuid> [auto|manual]</语法格式> <模块>mod_commands</模块> </row> <row row_id="187"> <命令名称>uuid_write_png</命令名称> <描述>从通话中获取图像</描述> <语法格式/> <模块>mod_png</模块> </row> <row row_id="188"> <命令名称>uuid_xfer_zombie</命令名称> <描述>允许挂断一个电话并继续下一个会话</描述> <语法格式><uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="189"> <命令名称>uuid_zombie_exec</命令名称> <描述>在指定的uuid上设置zombie_exec标志</描述> <语法格式><uuid></语法格式> <模块>mod_commands</模块> </row> <row row_id="190"> <命令名称>valet_info</命令名称> <描述>Valet Parking Info</描述> <语法格式>[<lot name>]</语法格式> <模块>mod_valet_parking</模块> </row> <row row_id="191"> <命令名称>version</命令名称> <描述>Version</描述> <语法格式>[short]</语法格式> <模块>mod_commands</模块> </row> <row row_id="192"> <命令名称>verto</命令名称> <描述>Verto API</描述> <语法格式>syntax</语法格式> <模块>mod_verto</模块> </row> <row row_id="193"> <命令名称>verto_contact</命令名称> <描述>生成ver-to-endpoint拨号字符串</描述> <语法格式>user@domain</语法格式> <模块>mod_verto</模块> </row> <row row_id="194"> <命令名称>vm_boxcount</命令名称> <描述>vm_boxcount</描述> <语法格式>[profile/]<user>@<domain>[|[new|saved|new-urgent|saved-urgent|all]]</语法格式> <模块>mod_voicemail</模块> </row> <row row_id="195"> <命令名称>vm_delete</命令名称> <描述>vm_delete</描述> <语法格式><id>@<domain>[/profile] [<uuid>]</语法格式> <模块>mod_voicemail</模块> </row> <row row_id="196"> <命令名称>vm_fsdb_auth_login</命令名称> <描述>vm_fsdb_auth_login</描述> <语法格式><profile> <domain> <user> <password></语法格式> <模块>mod_voicemail</模块> </row> <row row_id="197"> <命令名称>vm_fsdb_msg_count</命令名称> <描述>vm_fsdb_msg_count</描述> <语法格式><format> <profile> <domain> <user> <folder></语法格式> <模块>mod_voicemail</模块> </row> <row row_id="198"> <命令名称>vm_fsdb_msg_delete</命令名称> <描述>vm_fsdb_msg_delete</描述> <语法格式><profile> <domain> <user> <uuid></语法格式> <模块>mod_voicemail</模块> </row> <row row_id="199"> <命令名称>vm_fsdb_msg_email</命令名称> <描述>vm_fsdb_msg_email</描述> <语法格式><profile> <domain> <user> <uuid> <email></语法格式> <模块>mod_voicemail</模块> </row> <row row_id="200"> <命令名称>vm_fsdb_msg_forward</命令名称> <描述>vm_fsdb_msg_forward</描述> <语法格式><profile> <domain> <user> <uuid> <dst_domain> <dst_user> [prepend_file_location]</语法格式> <模块>mod_voicemail</模块> </row> <row row_id="201"> <命令名称>vm_fsdb_msg_get</命令名称> <描述>vm_fsdb_msg_get</描述> <语法格式><format> <profile> <domain> <user> <uuid></语法格式> <模块>mod_voicemail</模块> </row> <row row_id="202"> <命令名称>vm_fsdb_msg_list</命令名称> <描述>vm_fsdb_msg_list</描述> <语法格式><format> <profile> <domain> <user> <folder> <filter> [msg-order = ASC | DESC]</语法格式> <模块>mod_voicemail</模块> </row> <row row_id="203"> <命令名称>vm_fsdb_msg_purge</命令名称> <描述>vm_fsdb_msg_purge</描述> <语法格式><profile> <domain> <user></语法格式> <模块>mod_voicemail</模块> </row> <row row_id="204"> <命令名称>vm_fsdb_msg_save</命令名称> <描述>vm_fsdb_msg_save</描述> <语法格式><profile> <domain> <user> <uuid></语法格式> <模块>mod_voicemail</模块> </row> <row row_id="205"> <命令名称>vm_fsdb_msg_undelete</命令名称> <描述>vm_fsdb_msg_undelete</描述> <语法格式><profile> <domain> <user> <uuid></语法格式> <模块>mod_voicemail</模块> </row> <row row_id="206"> <命令名称>vm_fsdb_pref_greeting_get</命令名称> <描述>vm_fsdb_pref_greeting_get</描述> <语法格式><format> <profile> <domain> <user> [slot]</语法格式> <模块>mod_voicemail</模块> </row> <row row_id="207"> <命令名称>vm_fsdb_pref_greeting_set</命令名称> <描述>vm_fsdb_pref_greeting_set</描述> <语法格式><profile> <domain> <user> <slot> [file-path]</语法格式> <模块>mod_voicemail</模块> </row> <row row_id="208"> <命令名称>vm_fsdb_pref_password_set</命令名称> <描述>vm_fsdb_pref_password_set</描述> <语法格式><profile> <domain> <user> <password></语法格式> <模块>mod_voicemail</模块> </row> <row row_id="209"> <命令名称>vm_fsdb_pref_recname_set</命令名称> <描述>vm_fsdb_pref_recname_set</描述> <语法格式><profile> <domain> <user> <file-path></语法格式> <模块>mod_voicemail</模块> </row> <row row_id="210"> <命令名称>vm_inject</命令名称> <描述>vm_inject</描述> <语法格式>[group=<group>[@domain]|domain=<domain>|<box>[@<domain>]] <sound_file> [<cid_num>] [<cid_name>]</语法格式> <模块>mod_voicemail</模块> </row> <row row_id="211"> <命令名称>vm_list</命令名称> <描述>vm_list</描述> <语法格式><id>@<domain>[/profile] [xml]</语法格式> <模块>mod_voicemail</模块> </row> <row row_id="212"> <命令名称>vm_prefs</命令名称> <描述>vm_prefs</描述> <语法格式>[profile/]<user>@<domain>[|[name_path|greeting_path|password]]</语法格式> <模块>mod_voicemail</模块> </row> <row row_id="213"> <命令名称>vm_read</命令名称> <描述>vm_read</描述> <语法格式><id>@<domain>[/profile] <read|unread> [<uuid>]</语法格式> <模块>mod_voicemail</模块> </row> <row row_id="214"> <命令名称>voicemail</命令名称> <描述>voicemail</描述> <语法格式>rss [<host> <port> <uri> <user> <domain>] | [load|unload|reload] <profile> [reloadxml]</语法格式> <模块>mod_voicemail</模块> </row> <row row_id="215"> <命令名称>voicemail_inject</命令名称> <描述>voicemail_inject</描述> <语法格式>[group=<group>[@domain]|domain=<domain>|<box>[@<domain>]] <sound_file> [<cid_num>] [<cid_name>]</语法格式> <模块>mod_voicemail</模块> </row> <row row_id="216"> <命令名称>vpx</命令名称> <描述>VPX API</描述> <语法格式><reload|debug <on|off>></语法格式> <模块>CORE_VPX_MODULE</模块> </row> <row row_id="217"> <命令名称>xml_flush_cache</命令名称> <描述>清除xml缓存</描述> <语法格式><id> <key> <val></语法格式> <模块>mod_commands</模块> </row> <row row_id="218"> <命令名称>xml_locate</命令名称> <描述>查找一些xml</描述> <语法格式>[root | <section> <tag> <tag_attr_name> <tag_attr_val>]</语法格式> <模块>mod_commands</模块> </row> <row row_id="219"> <命令名称>xml_wrap</命令名称> <描述>用xml包装另一个api命令</描述> <语法格式><command> <args></语法格式> <模块>mod_commands</模块> </row> </result>命令说明
六、FreeSwitch的总体架构
总的来说,FreeSWITCH由一个稳定的核心(Core)及一些外围模块组成。这些外围的模块根据其功能和用途的不同又分为Endpoint、Codec、Dialplan、Application等不同的类别。
FreeSWITCH内部使用线程模型来处理并发请求,每个连接都在单独的线程中进行处理,不同的线程间通过Mutex互斥访问共享资源,并通过消息和异步事件等方式进行通信。这种架构能处理很高的并发,并且在多核环境中运算能均匀地分布到多颗CPU或单CPU的多个核心上。FreeSWITCH 的核心非常短小精悍,这也是其保持稳定的关键。绝大部分应用层的功能都在外围的模块中实现。外围模块是可以动态加载(以及卸载)的,在实际应用中可以只加载用到的模块。外围模块通过核心提供的Public API与核心进行通信,而核心则通过回调(或称钩子)机制执行外围模块中的代码。
1.数据库:默认情况下,FreeSwitch使用SQLLite嵌入式数据库,但也可以通过ODBC来使用其它数据库。
2.公共应用程序接口PublicAPI:FreeSWITCH在核心层实现了一些Public API。这些Public API可以被外围的模块调用。例如,当FreeSWITCH外围的Endpoint模块收到一个呼入请求时,该模块就可以调用核心的switch_core_session_request函数为该呼叫生成一个新的Session,此后,该呼叫的生命周期就由该Session管理。如果呼叫挂断,就调用switch_core_session_destroy函数将该Session释放。
3.接口:FreeSWITCH在核心中除实现了大量的Public API供外围模块调用外,还提供了很多抽象的接口,这些接口对同类型的逻辑或功能实体进行了抽象,但没有具体实现。具体的实现一般由外围的模块负责,核心层通过回调(钩子)方式调用具体的实现代码,常见如下:
SWITCH ENDPOINT_ INTERFACE:终点接口 SWITCH_TIMER_INTERFACE:定时器接口 SWITCH DIALPLAN_ INTERFACE:拨号计划接口 SWITCH_CODEC_INTERFACE:编解码接口 SWITCH_APPLICATION_INTERFACE:应用程序接口 SWITCH_API_INTERFACE:命令接口 SWITCH__FILE_INTERFACE:文件接口 SWITCH_SPEECH_ INTERFACE:语音合成接口 SWITCHDIRECTORY_INTERFACE:用户目录接口 SWITCH_CHAT_ INTERFACE:聊天计划接口 SWITCHSAY_INTERFACE:分词短语接口 SWITCH ASR_INTERFACE:语音识别接口 SWITCH MANAGEMENT_INTERFACE:网管接口 SWITCHLIMIT_INTERFACE:资源限制接口 SWITCH_CHAT_APPLICATION_INTERFACE:聊天应用程序接口
4.事件:除了使用Public API 及接口回调方式执行内部逻辑和通信外,FreeSWITCH在内部也使用消息和事件机制进行进程间和模块间通信。消息机制完全是内部的,但事件机制既可以在内部使用也可以在外部使用。当内部状态发送变化时会触发一系列事件,我们可以通过订阅事件来进行逻辑处理。
5.外部模块:
- 终点(Endpoint):终结FreeSWITCH的地方,也就是说再往外走就超出FreeSWITCH的控制了。它主要包含了不同呼叫控制协议的接口,如SIP、TDM硬件、H323以及Google Talk 等。
- 拨号计划(Dialplan):主要提供查找电话路由功能。系统默认的 Dialplan由mod_dialplan_xml提供,它是以XML描述的。
- 聊天计划( Chatplan):类似于 Dialplan,不同的是Chatplan主要对文本消息进行路由,如SIP SIMPLE、Skype Message、XMPP Message等,它是在mod_sms中实现的。
- 应用程序(Application,APP):FreeSWITCH提供了许多App使复杂的任务变得异常简单,如 mod_voicemail模块可以很简单地实现语音留言,而mod _conference模块则可以实现高质量的多方会议。
- XML接口(XML Interface):XML接口支持多种获取XML的方式,它可以从本地的配置文件或数据库中读取,甚至可以从一个能动态返回XML的远程HTTP服务器中读取。对XML 的解析和访问是在核心中实现的,但对 XML的应用和扩展都是在外部模块中完成的,如 mod_xml_rpc、mod_ xml_curl、mod_xml_cdr等。
- 编解码器(Codec):FreeSWITCH支持最广泛的Codec,除了大多数VolP系统支持的G711、G722、G729、GSM外,它还支持 iLBC、BV16/32、SILK、iSAC、CELT,OPUS等。它可以同时桥接不同采样频率的电话以及电话会议等。
- 语音识别及语音合成(ASR/TTS):支持语音自动识别(ASR)及文本/语音转换( TTS)。可以通过本地模块实现(如mod_flite),也可以通过MRCP协议与其他语音产品对接(如mod_unimrcp)实现。
- 格式、文件接口(Format, File Interface):支持不同格式的声音文件回放、录音,如WAV、MP3等。mod_sndfile模块通过libsndfile库提供了对大部分音频文件格式的支持。MP3格式是在mod_shout中实现的。
- 日志( Logger):日志可以写到控制台、日志文件、系统日志(syslog)以及远程的日志服务器。实现日志功能的模块有mod_console、mod_logfile、mod_syslog 等。
- 定时器(Timer):实时的话音通话需要非常准确的定时器。在 FreeSWITCH 中,可以使用软时钟( soft timer)或内核提供的时钟来定时。
- 嵌入式语言(Embeded Language):通过swig可支持多种嵌人式语言进而控制呼叫流程,如Lua、Javascript、Perl等。
- 事件套接字(Event Socket):通过Event Socket可以使用任何其他语言(只要支持Socket),通过TCP Socket可控制呼叫流程、扩展 FreeSWITCH 的功能。
七、总结
FreeSwitch是一套完整的软交换系统,涉及到的知识非常复杂,要想彻底精通,需要学习专门的书籍。本文的目的主要在于初步了解FreeSwitch的骨架和它的作用,具体开发中可以此来深入展开,查阅延展知识,慢慢熟悉FreeSwitch。推荐大神杜金房的<<FreeSWITCH权威指南>>,全部学完就是大神了,本文的知识点也是从此书中摘抄的。
标签:commands,uuid,voicemail,vm,fsdb,了解,简单,FreeSwitch,mod From: https://www.cnblogs.com/zqhIndex/p/17261549.html