FREESWITCH和SIP.JS进行参数传递

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/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值