FREESWITCH和SIP.JS进行参数传递
之前,一直遇到一个问题,困扰了很久,就是在freeswitch的dialplan中定义了许多业务需要的通道变量,但是不知道该如何用freeswitch将这些变量传递给sip.js,所以后续业务处理起来很麻烦. 通过查看freeswitch官方文档以及百度,总算找到了解决方案.
FREESWITCH通道变量
-
添加请求标头
- 您可以通过将字符串’sip_h_'添加到任何通道变量前面来向出站SIP调用添加任意标头,例如:
<action application="set" data="sip_h_X-Answer=42"/> <action application="bridge" data="sofia/mydomain.com/1000@example.com"/>
请注意,对于BYE请求,您需要在通道变量上使用前缀’sip_bye_h_’。
虽然不是必需的,但您应在标头前加上“X-”,以避免与其他SIP堆栈的互操作性问题。 所有入站SIP调用都会将任何X-header安装到本地变量中。 这意味着您可以轻松地将任何X-header从一个FreeSWITCH实例桥接到另一个。 要在第二个框中访问上面的标题,请使用频道变量$ {sip_h_X-Answer} 请务必注意,语法$ {sip_h_custom-header}不能用于检索任何不以X-开头的自定义标头。 这是因为Sofia只读取并放入以X-开头的变量自定义标题。
-
添加响应标头
可以设置三种类型的响应头前缀:-
响应头(Response header)
sip_rh_ -
临时响应标头(Provisional response header)
sip_ph_ -
再见响应头(Bye response header)
sip_bye_h_
每个前缀将专门为其给定类型的请求添加标头 - 没有“全局”响应标头前缀,它将为所有响应消息添加标头。例如:
<action application="set" data="sip_rh_X-Reason=Destination Number Not in Footprint"/> <action application="set" data="sip_bye_h_X-Accounting=Some Accounting Data"/>
-
sip.js传递参数到freeswitch
sip.js UA的invite方法的附加参数 extraHeaders参数,接收一个Array(String),我们需要传递到后台的参数需要放到此参数中.
格式是固定的,必须以X-
为前缀,示例:X-MY-FOO: IMSBSMY
,在freeswitch中获取时以${variable_sip_h_X-MY-FOO}
去获取值.
- sip.js部分代码
var number = document.getElementById("number").value; //创建一个新的出站(用户代理客户端)会话 session = ua.invite(number, { sessionDescriptionHandlerOptions: { constraints: { audio: true, video: false }, alwaysAcquireMediaFirst: true // 此参数是sip.js官方修复在firefox遇到的bug所设置 }, extraHeaders: [ 'X-MY-FOO: IMSBSMY', 'X-MY-BAR: 456789' ] }); //开始振铃 Ring.startRingbackTone();
- freeswitch dialplan 部分代码
<extension name="test" continue="true"> <condition field="destination_number" expression="^test(.*)$"> <action application="log" data="ERR X-MY-FOO=${sip_h_X-MY-FOO}" /> <action application="log" data="ERR X-MY-BAR=${sip_h_X-MY-BAR}" /> <action application="info" /> <action application="bridge" data="user/$1"/> </condition> </extension>
我们将呼叫 test1000,即可进入上面的dialplan中,打开fs控制台,可以观察到如下信息
freeswitch传递参数到sip.js
-
sip.js部分代码
ua.on('invite', function (session) { console.error(session.request.headers); console.error(session.request.getHeader("X-TASK-ID")); // 开始振铃 Ring.startRingTone(); var url = session.remoteIdentity.uri.toString() + "来电了,是否接听"; ...... ...... })
-
fs控制台执行的指令
originate {sip_h_X-TASK-ID=12345}user/admin12 &echo
FS添加请求头的时候规定了必须以sip_h_X-
为前缀,在前台获取时,从session.request.headers
中获取,也可以使用session.request.getHeader("X-TASK-ID")
方法获取,建议查看sip.js官方文档. -
chrome控制台日志如下:
红色框中的即为fs传递来的自定义参数
参考
- https://freeswitch.org/confluence/display/FREESWITCH/Sofia+SIP+Stack
- https://www.sipjs.com/api/0.13.0/sipMessage/