freeswitch实现互通并发送dtmf

基础环境搭建

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/dialplandefault.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得到如下日志
log
注:执行的命令也可以写入lua脚本中 参考 如何向通话的另一方号码发送dtmf?

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeSWITCH中,ESL(Event Socket Library)是一种基于网络的API,可以通过TCP/IP协议连接到FreeSWITCH,并发送命令或接收事件。使用ESL,可以在不修改FreeSWITCH源代码的情况下,实现FreeSWITCH的控制和管理。 要发送INFO消息,可以使用ESL API中的sendRecv()方法。该方法可以发送一个命令并等待FreeSWITCH的响应。下面是一个使用ESL发送INFO消息的示例代码: ``` #include <stdio.h> #include <string.h> #include <esl.h> int main(int argc, char *argv[]) { esl_handle_t handle = {{0}}; esl_status_t status; const char *uuid = "12345678-1234-1234-1234-123456789012"; const char *info = "Hello, world!"; // 连接到FreeSWITCH status = esl_connect(&handle, "127.0.0.1", 8021, NULL, "ClueCon"); if (status != ESL_SUCCESS) { printf("Failed to connect to FreeSWITCH\n"); return 1; } // 发送INFO消息 esl_send_recv(&handle, "sendmsg %s\n", "sip:1234@192.168.1.1;transport=tcp", "profile sip", "subject: INFO\r\n", "Content-Type: application/dtmf-relay\r\n", "Content-Length: 16\r\n", "\r\n", "Signal=1\r\nDuration=100\r\n" ); // 断开连接 esl_disconnect(&handle); return 0; } ``` 在上面的代码中,我们首先通过esl_connect()方法连接到FreeSWITCH。然后,使用esl_send_recv()方法发送一个名为"sendmsg"的命令,该命令可以发送SIP INFO消息。在命令中,我们指定了消息的目标地址、协议类型、消息头和消息体。最后,使用esl_disconnect()方法断开连接。 需要注意的是,上述代码中的消息体是一个DTMF Relay消息,这只是INFO消息的一种类型。在实际应用中,需要根据具体的需求,选择合适的消息类型和消息体格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值