FREESWITCH和SIP.JS进行参数传递

FREESWITCH和SIP.JS进行参数传递


之前,一直遇到一个问题,困扰了很久,就是在freeswitch的dialplan中定义了许多业务需要的通道变量,但是不知道该如何用freeswitch将这些变量传递给sip.js,所以后续业务处理起来很麻烦. 通过查看freeswitch官方文档以及百度,总算找到了解决方案.

FREESWITCH通道变量

  • 添加请求标头

    • 您可以通过将字符串’sip_h_'添加到任何通道变量前面来向出站SIP调用添加任意标头,例如:
    
    
    
    

    请注意,对于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_

    每个前缀将专门为其给定类型的请求添加标头 - 没有“全局”响应标头前缀,它将为所有响应消息添加标头。例如:

    
    
    
    

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 部分代码
    
      
            
    		
            
            
      
    
    
    

我们将呼叫 test1000,即可进入上面的dialplan中,打开fs控制台,可以观察到如下信息
FREESWITCH和SIP.JS进行参数传递_第1张图片

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传递来的自定义参数
    FREESWITCH和SIP.JS进行参数传递_第2张图片


参考

  • https://freeswitch.org/confluence/display/FREESWITCH/Sofia+SIP+Stack
  • https://www.sipjs.com/api/0.13.0/sipMessage/

你可能感兴趣的:(freeswitch学习,freeswitch,sip,自定义header)