基础环境搭建
freeswitch创建
创建两个freeswitch的Docker 端口设置 25060和35060
实现互通
预期是拨打25060转发到35060
配置25060网关
在25060中进入目录 /freeswitch/etc/freeswitch/directory/default
新建 bridge.xml
内容如下
<include>
<gateway name="gw1">
<param name="realm" value="SIP服务器地址,可以是IP或IP:端口号"/>
<param name="username" value="SIP用户名"/>
<param name="password" value="密码"/>
</gateway>
</include>
配置25060对50000转发
进入25060中进入目录 /freeswitch/etc/freeswitch/dialplan
编辑 default.xml
并插入
<extension name="bridge">
<condition field="destination_number" expression="^(\d{5,13})$">
<action application="bridge" data="sofia/gateway/gw1/$1"/>
</condition>
</extension>
配置35060的50000号码
进入35060中进入目录 /freeswitch/etc/freeswitch/dialplan
编辑 default.xml
并插入
<extension name="ivr_demo">
<condition field="destination_number" expression="^50000$">
<action application="answer"/>
<action application="sleep" data="2000"/>
</condition>
</extension>
之后再两边的fs_cli中执行reloadxml命令 并用sip软件连接25060拨打50000就可以拨打到35060上
从25060发送的dtmf信息到35060
25060使用命令发送dtmf
使用fs命令 uuid_send_dtmf uuid dtmfs
发送按键信息
需要先获取uuid 根据被叫号码50000 模糊查找channel信息
在通话中 在fs_cli执行 show channels like 50000 as xml
返回信息如下
<result row_count="1">
<row row_id="1">
<uuid>86ca6c90-b149-4e6c-8790-0f5b8bd2a81f</uuid>
<direction>outbound</direction>
<created>2020-10-29 17:09:33</created>
<created_epoch>1603962573</created_epoch>
<name>sofia/external/50000</name>
<state>CS_EXCHANGE_MEDIA</state>
<cid_name>Extension 1004</cid_name>
<cid_num>1010</cid_num>
<ip_addr>*.*.*.*</ip_addr>
<dest>50000</dest>
<application></application>
<application_data></application_data>
<dialplan>XML</dialplan>
<context>default</context>
<read_codec>PCMU</read_codec>
<read_rate>8000</read_rate>
<read_bit_rate>64000</read_bit_rate>
<write_codec>PCMU</write_codec>
<write_rate>8000</write_rate>
<write_bit_rate>64000</write_bit_rate>
<secure></secure>
<hostname>1905c6ebe853</hostname>
<presence_id></presence_id>
<presence_data></presence_data>
<accountcode></accountcode>
<callstate>ACTIVE</callstate>
<callee_name>50000</callee_name>
<callee_num>50000</callee_num>
<callee_direction>SEND</callee_direction>
<call_uuid>78bc395c-0ce0-4b00-b4b6-977989f7801f</call_uuid>
<sent_callee_name>Extension 1004</sent_callee_name>
<sent_callee_num>1010</sent_callee_num>
<initial_cid_name>Extension 1004</initial_cid_name>
<initial_cid_num>1010</initial_cid_num>
<initial_ip_addr>*.*.*.*</initial_ip_addr>
<initial_dest>50000</initial_dest>
<initial_dialplan>XML</initial_dialplan>
<initial_context>default</initial_context>
</row>
</result>
填充参数 fs_cli执行命令 uuid_send_dtmf 86ca6c90-b149-4e6c-8790-0f5b8bd2a81f 123
发送按键信息123
35060使用lua脚本监听按键信息
进入35060中进入目录 /freeswitch/share/freeswitch/scripts
新建 dtmf.lua
function onInputCBF(s, type, obj, arg)
if (type == "dtmf") then
freeswitch.consoleLog("INFO", "===================================================\n")
freeswitch.consoleLog("INFO", "===================================================\n")
freeswitch.consoleLog("INFO", "===================================================\n")
freeswitch.consoleLog("INFO", "===================================================\n")
freeswitch.consoleLog("INFO", "===================================================\n")
freeswitch.consoleLog("INFO", "===================================================\n")
freeswitch.consoleLog("INFO", "===================================================\n")
freeswitch.consoleLog("INFO", "Got DTMF: "..obj.digit.." Duration: "..obj.duration.."\n")
end
return ''
end
session:answer()
session:execute("start_dtmf", "")
session:setInputCallback('onInputCBF', '')
session:streamFile("local_stream://moh")
进入目录 /freeswitch/etc/freeswitch/dialplan
在 default.xml
中的50000路由中载入lua脚本
<extension name="get_dtmf">
<condition field="destination_number" expression="^50000$">
<action application="lua" data="dtmf.lua"/>
</condition>
</extension>
两边reloadxml后再25060发送 uuid_send_dtmf 86ca6c90-b149-4e6c-8790-0f5b8bd2a81f 123
的同时 会在35060得到如下日志
注:执行的命令也可以写入lua脚本中 参考 如何向通话的另一方号码发送dtmf?